2014-09-07 4 views
2

Я использую транзакции, управляемые контейнером, в своем приложении JavaEE, но, как я понял, управляемые контейнером сущности-сундуки не имеют поддержки для пакетных вставок. И теперь у меня есть случай, когда я вложу много данных в БД. Возможно ли каким-то образом объединить управляемый контейнером entitymanager с управляемым приложениями entitymanager в компоненте?Можно ли комбинировать управляемый контейнером управляемый контейнером и управляемый приложениями в bean-компоненте?

Если это так, я могу сделать метод в своем компоненте, который фиксирует данные после того, как я вызвал entitymanager.persist(myEntity); несколько раз, сделав его вставкой в ​​пакет.

Но для этого, теперь я должен установить @TransactionManagement(TransactionManagementType.BEAN) для всего класса/компонента, что позволит управлять всем компонентом. Но я хочу, чтобы мои другие методы управлялись контейнерами, а только один метод (метод, в котором пакетные вставки) управлялся приложением.

Возможно ли это или есть какие-либо другие подходы для таких случаев?

ответ

1

JDBC batching - это сквозная проблема, и вы можете заставить ее работать для всех конфигураций менеджера сущностей.

Прежде всего, необходимо установить следующие свойства Hibernate:

<property name="hibernate.order_updates" value="true"/> 
<property name="hibernate.order_inserts" value="true"/> 
<property name="hibernate.jdbc.batch_versioned_data" value="true"/> 
<property name="hibernate.jdbc.fetch_size" value="20"/> 
<property name="hibernate.jdbc.batch_size" value="50"/> 

Также убедитесь, что вы используете последовательности или идентификатор таблицы генераторы, так как IDENTITY will disable JDBC batching.

Подробнее об оптимизации дозирования please read this article.

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