我有一个非常简单的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在做"部分刷新"时该做些什么,以及如何减少这些刷新?
答案 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以确保没有发生部分冲洗。
至于时间安排,减少部分冲洗会增加冲洗所需的总时间,因此您需要了解权衡是否值得。