带有分区PostgreSQL的hibernate插入批处理
时间:2020-03-05 18:58:51 来源:igfitidea点击:
有没有解决方案通过休眠在分区的postgresql表中进行批量插入?目前我遇到这样的错误...
ERROR org.hibernate.jdbc.AbstractBatcher - Exception executing batch: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61) at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46) at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)....
我已经找到此链接http://lists.jboss.org/pipermail/hibernate-dev/2007-October/002771.html,但是我在网络上找不到任何地方可以解决此问题或者如何解决该问题
解决方案
回答
我们可能想通过设置hibernate.jdbc.factory_class属性来尝试使用自定义的Batcher。确保休眠状态不会检查批处理操作的更新次数可能会解决问题,可以通过使自定义Batcher扩展类BatchingBatcher,然后覆盖方法doExecuteBatch(...)来实现此目的:
@Override protected void doExecuteBatch(PreparedStatement ps) throws SQLException, HibernateException { if ( batchSize == 0 ) { log.debug( "no batched statements to execute" ); } else { if ( log.isDebugEnabled() ) { log.debug( "Executing batch size: " + batchSize ); } try { // checkRowCounts( ps.executeBatch(), ps ); ps.executeBatch(); } catch (RuntimeException re) { log.error( "Exception executing batch: ", re ); throw re; } finally { batchSize = 0; } } }
请注意,新方法不会检查执行准备好的语句的结果。请记住,进行此更改可能会以某种意外的方式(或者可能不会)影响休眠状态。
回答
谢谢!它成功了,到目前为止还没有出现任何问题:)....你一件事...
我必须实现BatcherFactory
类并将其放入persistence.xml
文件中,
像这样:
property name="hibernate.jdbc.factory_class" value="path.to.my.batcher.factory.implementation"
我从那家工厂用上面的代码调用了我的批处理程序实现
ps
休眠核心3.2.6 GA
再次感谢
回答
他们说要在分区表或者@SQLInsert批注中使用两个触发器:http://www.redhat.com/f/pdf/jbw/jmlodgenski_940_scaling_hibernate.pdf第21-26页(它也提到了@SQLInsert指定一个字符串方法)。
这是一个带有after触发器的示例,用于删除master中的多余行:https://gist.github.com/copiousfreetime/59067