我的进程存在性能问题。这是一个在CMT bean(在jboss服务器上)启动的异步任务。在一个线程中EJB事务减慢
1次迭代通过Hibernate执行1次更新和3次插入到我的数据库。该过程每隔100次迭代就会分成新的事务。
每次更新/插入之后都会在EntityManager上调用Flush。
虽然第一批的起始性能令人满意(大约5-8秒),但随着时间的推移,它会急剧下降。第30批大约需要30秒才能完成,后来每批生产超过2分钟。
我试着将FlushModeType切换到COMMIT,手动清除/关闭entityManagers,清理entityManagers缓存,我查找内存泄漏并找不到原因。
我测量了一小段代码执行时间,涉及数据库连接的每个代码都随着时间的推移而变慢。我知道一个事务处理越慢,处理的实体就越多,但为什么新事务也会变慢呢?
最新的流程包含250 000次迭代(1个线程中的2500个事务)并且永久结束。
如果需要,我会提供更多信息。任何帮助,将不胜感激。
我试过简化这段代码只做一个hibernate插入和没有其他操作,它仍然随着时间减慢。这是内部发生的一个抽象的伪视图。
Bean1
@Asynchronous
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void mainTask(){
while(...){
subTask();
}
}
Bean2
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void subTask(){
100.times{
3*Insert
1*Update
}
}
感谢您的回复,我必须补充说内部事务没有任何回应。我检查了以前迭代中的旧实体是垃圾收集的。在您回复之后,我试图在交易完成后明确清除/关闭会话,但没有任何更改。我还打印了hibernate SQL语句,并确认只有3个插入和1个更新完成。我想这意味着我现在必须找到一些解决方法,或者像Sameer Mali建议的那样切换到JDBC。 –
我想建议在hibernate中使用自定义查询进行最后的尝试。这些在DB中执行。请参阅http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#querysql-cud这应该有助于您继续使用hibernate,并且在特定情况下不会切换到JDBC。 – Taps