2

谁能建议我在休眠中导致此错误的原因是什么。我正在使用 OpenMobster 云服务器(MBaaS 工具)在 Android 中进行数据同步。

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
4

1 回答 1

4

这里的问题是“GenericJDBCException:无法执行 JDBC 批量更新”——它没有告诉您为什么无法执行给定的语句。

一种解决方案是使用 BatchUpdateException.getNextException 来获取批处理异常的原因。但是,这可能只是返回 null,例如因为 jdbc 驱动程序不支持它。所以替代的解决方案是当我们没有得到任何关于批量更新失败原因的信息时,我们必须想办法阻止hibernate批量更新。这在像测试用例这样的隔离环境中运行时很有用。

这可以通过在系统属性中添加以下内容来实现:

-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 提供了 hibernate.jdbc.factory_class 配置属性,它接受 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/

于 2014-09-11T05:29:27.060 回答