谁能给我建议一下是什么导致了冬眠中的这个错误呢?我正在使用OpenMobster云服务器(MBaaS工具)来进行数据同步。
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发布于 2014-09-11 05:29:27
这里的问题是"GenericJDBCException:未能执行JDBC批处理更新“--它没有告诉您为什么不能执行给定的语句。
一种解决方案是使用BatchUpdateException.getNextException获取批处理异常的原因。但是,这可能只是返回null,例如,因为jdbc驱动程序不支持它。因此,另一种解决方案是,当我们没有得到有关批处理更新失败原因的任何信息时,我们必须找到防止hibernate批处理的方法。例如,在像testcase这样的孤立环境中运行时,这是非常有用的。
这可以通过在系统属性中添加以下内容来实现:
-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,这正是我们在本例中想要的。适当的hibernate配置可能如下所示:
final Configuration config = new Configuration();
// ... more config here
config.setProperty( "hibernate.jdbc.factory_class", "org.hibernate.jdbc.NonBatchingBatcherFactory" );生成上述BatchUpdateException的代码现在将导致实际的异常,这可以很容易地跟踪。在测试运行中更改一次批处理策略以查看单个sql异常是很有帮助的。但是,当生产设置不同时,您不应该更改所有测试或持续集成的策略。
参考资料:
https://stackoverflow.com/questions/25718015
复制相似问题