В WebSphere 7 работает приложение OpenJPA 1.2.3, и по некоторым причинам мы не можем использовать там внедрение зависимостей для менеджеров сущностей. Таким образом, мы управляем ими вручную, закрывая их после фиксации/отката транзакции. Недавно я обнаружил, что вызов EntityManager.close()
занимает значительное время (около 10% всей операции, включающей загрузку ~500 сущностей). Что он делает, так это отсоединяет все объекты, загруженные во время транзакции. Так что собственно 2 вопроса:
- Почему вообще нам нужно отсоединять все сущности при закрытии диспетчера сущностей? Это потому, что JPA должен проверять все объекты, грязные они или нет?
- Поскольку в некоторых случаях сущности загружаются для доступа только для чтения - можно ли как-то указать OpenJPA, что эти сущности не должны обновляться и нет необходимости помечать их как грязные, обновлять в БД и т.д.?
Добавление моего persistence.xml
по запросу:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="DocumentUnit" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>ru.mypackage.Document</class>
<class>ru.mypackage.DocParam</class>
<class>ru.mypackage.DocParamPK</class>
<!-- Some more classes -->
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
</properties>
</persistence-unit>
</persistence>