Hibernate 批量操作性能
Hibernate Batch Operation performance
我有大约 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();
}
您有一个事务处理大量的对象。在这里你可能也会有内存泄漏和性能问题。
对象引用将保留在内存中,直到执行会话刷新(提交)。因此,除了有关对象更改的大量信息外,内存中还会有大量对象,这些信息也将保留在休眠会话中并且也会改变性能(我不是休眠专家,但你应该考虑这一点)
我认为您可能会考虑使用大量事务
查看这些有趣的链接:
Transaction Management for bulk operations
Hibernate session and Transaction Management Guidelines
祝你好运
侯赛因
如果我们查看您的代码,那根本就不是休眠问题。
我建议您注释掉与网络服务调用相关的行。
那请重试batch hql 运行.
也许网络会变慢。
我有大约 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();
}
您有一个事务处理大量的对象。在这里你可能也会有内存泄漏和性能问题。 对象引用将保留在内存中,直到执行会话刷新(提交)。因此,除了有关对象更改的大量信息外,内存中还会有大量对象,这些信息也将保留在休眠会话中并且也会改变性能(我不是休眠专家,但你应该考虑这一点) 我认为您可能会考虑使用大量事务
查看这些有趣的链接:
Transaction Management for bulk operations
Hibernate session and Transaction Management Guidelines
祝你好运
侯赛因
如果我们查看您的代码,那根本就不是休眠问题。 我建议您注释掉与网络服务调用相关的行。
那请重试batch hql 运行.
也许网络会变慢。