2014-09-08 3 views
0

Может кто-нибудь предложить мне, что вызывает проблему для этой ошибки в hibernate. Я использую CloudMobster Cloud Server (средство MBaaS) для синхронизации данных в Android.Hibernate - Не удалось выполнить пакетное обновление JDBC

2014-09-08 10:43:15,763 WARN [org.hibernate.util.JDBCExceptionReporter] (Thread-14) SQL Error: 0, SQLState: null 
2014-09-08 10:43:15,763 ERROR [org.hibernate.util.JDBCExceptionReporter] (Thread-14) failed batch 
2014-09-08 10:43:15,764 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] (Thread-14) Could not synchronize database state with session 
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update 
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java :126) 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEven tListener.java:321) 
    at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListe ner.java:64) 
    at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:996) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1141) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:835) 
    at org.openmobster.core.synchronizer.server.engine.ServerSyncEngineImpl.getChangeLogEntry(Serve rSyncEngineImpl.java:576) 
    at org.openmobster.core.synchronizer.server.engine.ServerSyncEngineImpl.addChangeLogEntries(Ser verSyncEngineImpl.java:548) 
    at org.openmobster.core.synchronizer.event.SyncChannelEventListener.updateChangeLog(SyncChannel EventListener.java:126) 
    at org.openmobster.core.synchronizer.event.SyncChannelEventListener.channelUpdated(SyncChannelE ventListener.java:95) 
    at org.openmobster.core.services.CometService.broadcastChannelEvent(CometService.java:106) 
    at org.openmobster.core.services.MobileObjectMonitor.messageIncoming(MobileObjectMonitor.java:205) 
    at org.openmobster.core.common.bus.BusConsumer.sendBusListenerEvent(BusConsumer.java:184) 
    at org.openmobster.core.common.bus.BusConsumer.consume(BusConsumer.java:120) 
    at org.openmobster.core.common.bus.BusConsumer.run(BusConsumer.java:77) 
    at java.lang.Thread.run(Thread.java:724) 
    Caused by: java.sql.BatchUpdateException: failed batch 
    at org.hsqldb.jdbc.jdbcStatement.executeBatch(Unknown Source) 
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(Unknown Source) 
    at org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:774) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    ... 18 more 

ответ

2

Проблема здесь является «GenericJDBCException: Не удалось выполнить JDBC пакетного обновления» - это does't сказать вам, почему данное утверждение не может быть выполнена.

Одним из решений является использование BatchUpdateException.getNextException, чтобы получить причину исключения пакета. Однако может случиться так, что это просто возвращает нуль, например. потому что драйвер jdbc не поддерживает его. Таким образом, альтернативное решение заключается в том, что мы не получаем никакой информации о причине сбоя обновления пакета, мы должны найти способ предотвратить спящий режим от партии. Это полезно при работе в изолированной среде, например, в тестовой системе.

Это может быть достигнут путем добавления следующего к свойствам системы:

-Dhibernate.statement_cache.size=0 
-Dhibernate.jdbc.batch_size=0 
-Dhibernate.jdbc.use_scrollable_resultset=false 
-Dhibernate.bytecode.use_reflection_optimizer=false 
-Dhibernate.show_sql=true 

Другим способом достижения этого является: для изменения стратегии исполнения спящего режима обеспечивает свойство конфигурации hibernate.jdbc.factory_class, который принимает реализации of org.hibernate.jdbc.BatcherFactory. Hibernate уже предоставляет NonBatchingBatcherFactory, чего мы хотим в нашем случае. Соответствующая конфигурация спящего режима может выглядеть следующим образом:

final Configuration config = new Configuration(); 
// ... more config here 
config.setProperty("hibernate.jdbc.factory_class", "org.hibernate.jdbc.NonBatchingBatcherFactory"); 

код, который произвел BatchUpdateException выше в настоящее время приведет к фактическому исключению, которое может быть легко прослежено. полезно изменить стратегию дозатора один раз для пробного запуска, чтобы увидеть отдельные исключения sql. Но вы не должны изменять стратегию для всех тестов или для непрерывной интеграции, в то время как настройки производства разные.

Ссылка:

  1. http://www.eishay.com/2010/04/testing-with-hibernate.html

  2. http://inoio.de/blog/2012/11/16/how-to-get-rid-of-hibernate-genericjdbcexception/

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