首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate -无法执行JDBC批处理更新。

Hibernate -无法执行JDBC批处理更新。
EN

Stack Overflow用户
提问于 2014-09-08 05:38:37
回答 1查看 3.8K关注 0票数 2

谁能给我建议一下是什么导致了冬眠中的这个错误呢?我正在使用OpenMobster云服务器(MBaaS工具)来进行数据同步。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-11 05:29:27

这里的问题是"GenericJDBCException:未能执行JDBC批处理更新“--它没有告诉您为什么不能执行给定的语句。

一种解决方案是使用BatchUpdateException.getNextException获取批处理异常的原因。但是,这可能只是返回null,例如,因为jdbc驱动程序不支持它。因此,另一种解决方案是,当我们没有得到有关批处理更新失败原因的任何信息时,我们必须找到防止hibernate批处理的方法。例如,在像testcase这样的孤立环境中运行时,这是非常有用的。

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

代码语言:javascript
复制
-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配置可能如下所示:

代码语言:javascript
复制
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/
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25718015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档