Спящий режим игнорирует ложную настройку Autocommit.Вместо этого создаем локальное соединение - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь выполнить пакетное сохранение или обновление новых объектов в базе данных MySQL через Hibernate. Я помещаю транзакции.begin и транзакции.commit вокруг цикла, который выполняет генерацию сущности и передает ее в session.saveorUpdate. Однако на каждом проходе hibernate подключается к БД, а не фиксирует в конце, когда я вызываю транзакции. При проверке журналов выводятся из спящего режима: соединение 'локальная транзакция' будет зафиксировано, и соединение будет установлено в режим автоматической фиксации

Пока у меня есть, 1) попытался добавить disabledLocalTxn в true для URL соединения, но безрезультатно, 2) для свойства autocommit установлено значение false, но не имеет конечного эффекта

Спящие свойства:

<property name="hibernate.connection.url">jdbc:mysql://url:port/Dbname?disableLocalTxn=true</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  <property name="hibernate.show_sql">false</property>
  <property name="hibernate.hbm2ddl.auto">validate</property>
  <property name="hibernate.current_session_context_class">thread</property>
  <property name="hibernate.jdbc.batch_size">50</property>
  <property name="hibernate.order_inserts">true</property>
  <property name="hibernate.connection.autocommit">false</property>
  <property name="hibernate.hbm2ddl.jdbc_metadata_extraction_strategy">individually</property>
  <mapping class="Object1"/>
  <mapping class="Object2"/>

код:

tx = session.getTransaction()
tx.begin();

for(i in elements){

session.saveOrUpdate(generateObject1(i));// - Hibernate queries here 

}
tx.commit;// - instead of all at end

Вывод журнала ниже, в последней строке указано, что соединение будет установлено на автоматическую фиксацию

Jun 11, 2019 9:26:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Jun 11, 2019 9:26:06 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Jun 11, 2019 9:26:12 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Jun 11, 2019 9:26:13 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
Jun 11, 2019 9:26:27 PM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@2257fadf] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

1 Ответ

0 голосов
/ 19 июня 2019

Чтобы покончить с этим, если кто-то здесь что-то достиг.

Требуется автоматическая фиксация, поскольку операторы ddl настроены на обновление.Таким образом, только операторы ddl выполняются в режиме автоматической фиксации true

Однако, когда вы выполняете ручную обработку транзакций через session.beginTransaction и tx.commit, она выполняется так же, как в режиме автоматической фиксации false.

Так что все хорошо.Была некоторая путаница из-за дополнительных запросов, когда он выбирал в db для saveOrUpdate ()

...