如何减少部分冲洗

时间:2015-08-13 09:25:59

标签: java mysql hibernate

我有一个非常简单的Java应用程序,使用Hibernate作为ORM框架。

该应用程序从db中获取(在单个事务中)几千个对象并返回它们。这些实体没有更新。

hibernate统计数据显示以下内容:

Session Metrics {
 25042 nanoseconds spent acquiring 1 JDBC connections;
 0 nanoseconds spent releasing 0 JDBC connections;
 1319016 nanoseconds spent preparing 11 JDBC statements;
 83631650 nanoseconds spent executing 11 JDBC statements;
 0 nanoseconds spent executing 0 JDBC batches;
 0 nanoseconds spent performing 0 L2C puts;
 83723194 nanoseconds spent performing 1766 L2C hits;
 13593721 nanoseconds spent performing 1764 L2C misses;
 12664271 nanoseconds spent executing 1 flushes (flushing a total of 5928 entities and 7755 collections);
16903049699 nanoseconds spent executing 1767 partial-flushes (flushing a total of 10457112 entities and 10457112 collections)
}

正如你所看到的,当Hibernate正在进行"部分刷新时,我会浪费大量时间。东西。

有人可以帮助我了解Hibernate在做"部分刷新"时该做些什么,以及如何减少这些刷新?

1 个答案:

答案 0 :(得分:1)

Hibernate在事务列表增加时执行部分刷新,特别是当会话调用的顺序满足您可以在此处找到的模板时:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-flushing

避免部分刷新的一种方法是将FlushMode设置为COMMIT或具体如下:

sess = sf.openSession();
Transaction tx = sess.beginTransaction();
sess.setFlushMode(FlushMode.COMMIT);

这样可以保持所有刷新,直到tx.commit()发生。

我之前遇到过一个问题,即记录将被部分刷新并且会发生数据库插入。由于这些部分刷新使用插入记录更新了数据库,因此在回滚失败时它们不会被删除。我不得不改变FlushMode以确保没有发生部分冲洗。

至于时间安排,减少部分冲洗会增加冲洗所需的总时间,因此您需要了解权衡是否值得。