2015-10-05 197 views
2

我有大约5000条记录要更新。我正在尝试测量操作的性能。它从大约100毫秒开始,但是在每千次更新之后,操作时间大约会增加80毫秒。为什么它放缓? JVM?休眠批处理操作性能

StatelessSession session = dao.getStatelessSession(); 
Transaction transaction = session.beginTransaction(); 
try { 
    List<Entity> list = dao.findAll(); 
    int counter = 0; 
    for (Entity each : list) { 
     final Date startTime = Clock.getTime(); 
     webService.execute(each); 
     session.update(each); 
     counter += 1; 
     final Date endTime = Clock.getTime(); 
     LOGGER.info("***** " + getMilliSecondsDifference(startTime, endTime) + " for count: " + counter + "*****"); 
    } 
} catch (Exception e) { 
    LOGGER.info("***** Exception occured : ", e); 
} finally { 
    transaction.commit(); 
    session.close(); 
} 
+3

也是一个webService调用。是什么让你想到hibernate越来越慢?我建议你关闭werbservice执行部分并再次测量。 –

+0

关闭web服务调用后,我尝试了15000个实体,他们都是4毫秒左右。这似乎是答案,但我不能接受评论作为答案。你能发表这个答案吗? –

回答

1

Hüseyin,

如果我们看看你的代码,它并不一定是休眠问题。 我建议你注释掉与webservice调用相关的行。

然后请再次尝试批处理hql运行。

也许网络可能会变慢。

0

您有一个事务并处理大量对象。在这里你可能会有内存泄漏和性能问题。 对象引用将保留在内存中,直到执行会话刷新(提交)。所以你将在内存中拥有大量的对象,此外还有大量关于对象变化的信息,这些信息也将保存在休眠会话中,并且可能会改变性能(我不是休眠专家,但你应该考虑到这一点) 我认为,你可以考虑使用大量的交易

见论文相关链接:

Transaction Management for bulk operations

Hibernate session and Transaction Management Guidelines

好运

+0

我正在使用StatelessSession,它不保留每个脏对象。即使对于正常的会话,多次交易也是不必要的你只需要冲洗和清除。如你所说,我用多次交易来衡量,这是一样的。 –

+0

我看,这使得它更加复杂,你可以尝试看看它是由web服务调用还是数据库引起的。尝试忽略其中的一个并查看结果(例如忽略更新并保持web服务调用) – jMounir