为什么Hibernate会使用每个SQL查询更新UpdateTimestampsCache

时间:2011-12-12 16:03:07

标签: hibernate query-cache

我在我的应用中启用了第二级和查询缓存 看起来我调用以下代码

String sql = "update SOME_TABLE set SOME_FIELD=somevalue";
SQLQuery query = getSession().createSQLQuery(sql);
query.executeUpdate();

hibernate为所有表更新UpdateTimestampsCache。为什么他这样做?我的应用程序中有大约1000个表和许多SQL查询。我不需要这个更新,因为我不通过SQL更新缓存的表。它会导致巨大的网络流量和应用程序的缓慢。

有没有办法告诉hibernate在运行sql查询时不进行任何更新?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用StatelessSession代替普通会话。您也可以使用直接JDBC而不是hibernate的createSQLQuery方法。

另一种选择是使用HQL更新查询而不是SQL。这可能能够确定您要更新的实体,并且仅使该查询的查询结果无效。当您触发SQL查询时,hibernate不知道哪个表正在更新 - 所以为了更安全,它会将所有查询缓存结果标记为无效。

答案 1 :(得分:0)

我找到了解决方案!

您可以使用addSynchronizedEntityClass()方法

String sql = "update SOME_TABLE set SOME_FIELD=somevalue";
SQLQuery query = getSession().createSQLQuery(sql);
query.addSynchronizedEntityClass(SomeTable.class)
query.executeUpdate();

在这种情况下,它将仅重置SOME_TABLE的缓存