2013-04-11 4 views
1

Я пишу приложение JPA на Glassfish 3.1.2.2, EclipseLink 2.3.2. Я использую Spring MVC, а также, с управляемой контейнером EntityManager (@PersistenceContext впрыскивается весной, но созданный контейнер с помощью jee:jndi-lookup)EclipseLink пакетная запись не работает в приложении JPA/JTA

Я поставил eclipselink.jdbc.batch-writing в JDBC в persistence.xml и это не работает, как ожидалось.

Моего кода имеет достаточно простую петлю, чтобы написать кучу объектов

UserTransaction tx = ...; 
tx.begin(); 
for (MyObject obj : list) { 
    entityManager.persist(obj); 
} 
tx.commit(); 

Batch написание делает работы, если я заменю UserTransaction с @Transactional аннотацией вокруг метода, хотя!

Я вижу отдельную единицу работы, созданную для каждого сохраняется вызов:

FINER: client acquired: 3418589 
FINER: TX binding to tx mgr, status=STATUS_ACTIVE 
FINER: acquire unit of work: 11053522 
FINEST: persist() operation called on: [email protected] 
.... 
FINER: client acquired: 23361578 
FINER: TX binding to tx mgr, status=STATUS_ACTIVE 
FINER: acquire unit of work: 17636998 
FINEST: persist() operation called on: [email protected] 

Операция БД не на самом деле не выполнить до фиксации, как и следовало ожидать - но каждая единица работы имеет свою собственную партию :

FINER: TX beforeCompletion callback, status=STATUS_ACTIVE 
FINER: begin unit of work commit 
FINER: TX beginTransaction, status=STATUS_ACTIVE 
FINEST: Execute query InsertObjectQuery([email protected]) 
FINEST: Connection acquired from connection pool [default]. 
FINEST: Execute query 
FINER: Begin batch statements 
FINE: INSERT INTO .... 
FINE: bind => [24 parameters bound] 
FINER: End Batch Statements 

Любые идеи, что мне не хватает? Я считаю, что корень проблемы - это отдельная единица работы на каждый упор.

Примечание Я сделать см пакетирования работы для дочерних организаций, которые каскадно через один сохраняются, в одной единице работы. Но каждый набор родителей/детей является результатом отдельной партии.

+0

Какой драйвер JDBC вы использовали и поддерживает ли он пакетное письмо. –

+0

Oracle. Поддержка JDBC-драйверов, когда я использую JDBC напрямую (не через JPA) – wrschneider

+0

Также см. Комментарий в редакторе – wrschneider

ответ

0
  • Для Oracle вы можете попробовать настроить его в файле persistence.xml.

    <property name="eclipselink.jdbc.batch-writing" value="Oracle-JDBC"/>

    Из документации:

    оракула JDBC: Используйте встроенную пакетную запись платформы Oracle. На карте свойств используйте OracleJDBC.

    Примечание: для этого требуется драйвер JDBC Oracle.

  • Else, его также можно настроить через свойство.

    propertyMap.put(PersistenceUnitProperties.BATCH_WRITING, BatchWriting.OracleJDBC);

В связи с пакетной записи, может иметь eclipselink.jdbc.batch-writing.size указать размер пакета.

[Сообщение EclipseLink конкретно, я не очень знаком с весны]

0

Вы, кажется, смешивая Java EE транзакции и пружинные транзакции. Вы должны использовать тот или иной.

Если вы хотите использовать JTA, вам необходимо настроить свою настойчивость.xml для использования JTA и убедитесь, что вы правильно настроили «eclipselink.target-server» (он будет установлен по умолчанию, если вы получите доступ к нему из Glassfish, но если вы получите доступ к нему из Spring, это не будет).

+0

persistence.xml был уже настроен для использования JTA. eclipselink.target-server уже установлен. И Spring был настроен на использование '', поэтому в аннотации Spring '@ Transactional' все еще использовались транзакции JTA. – wrschneider

Смежные вопросы