我有一个简单的Hibernate查询,如:
from MyEntity where name = ?
Run Code Online (Sandbox Code Playgroud)
没有什么花哨的,但它在一次相当大的交易中被多次调用(持续一秒钟,可能会加载数十个或数百个实体).Profiler显示花费了大量时间:
org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1240)
org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
Run Code Online (Sandbox Code Playgroud)
换句话说 - 在运行实际查询之前刷新更改.
我可以以某种方式阻止Hibernate完成这个冲洗吗?
如果没有,我该怎么做才能让它更快?
Ste*_*vie 14
默认情况下,hibernate在会话期间(FlushMode.AUTO)发出查询之前会刷新,并且会占用大量的CPU时间.如果您的会话中交替运行许多查询和更新,则会特别痛苦.
如果查询可能选择在当前会话期间插入/更新/删除的后退数据,则需要进行这些刷新.这可能也是即使您没有修改在当前事务中任何东西,但使用的事务隔离级别一样读未提交的情况.
假设您不想要未提交的读取等,我知道有两种解决方法:
如果您确定选择了此会话中尚未修改的数据,则可以将flush-mode明确设置为不会触发刷新的内容,如下所示:
Query query = session.getNamedQuery(SOME_QUERY_NAME);
query.setFlushMode(FlushMode.COMMIT);
Run Code Online (Sandbox Code Playgroud)