我的流程存在性能问题。这是一个在 CMT bean 中启动的异步任务(在 jboss 服务器上)。
1 次迭代通过 Hibernate 对我的数据库执行 1 次更新和 3 次插入。该过程每 100 次迭代分为新事务。
每次更新/插入后都会在 EntityManager 上调用 Flush。
虽然第一批的开始表现令人满意(大约 5-8 秒),但随着时间的推移,它会急剧下降。第 30 批大约需要 30 秒才能完成,后来每批增长到 2 分钟以上。
我尝试将 FlushModeType 切换为 COMMIT,手动清除/关闭 entityManagers,清除 entityManagers 缓存,查找内存泄漏,但找不到导致速度变慢的原因。
我测量了一点点代码执行时间,每个涉及数据库连接的代码都会随着时间的推移而变慢。我知道交易会随着处理更多实体而变慢,但为什么新交易也会变慢?
最新的过程由 250 000 次迭代(1 个线程中的 2500 个事务)组成,并且需要永远结束。
如果需要,我会提供更多信息。任何帮助,将不胜感激。
我尝试简化此代码只是为了执行 1 次休眠插入而没有其他操作,但它仍然会随着时间的推移而变慢。这是对内部情况的抽象伪视图。
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
}
}