我已经启用了二级缓存,当我调用以下代码时,我的应用程序中的查询缓存看起来就像这样
String sql = "update SOME_TABLE set SOME_FIELD=somevalue";
SQLQuery query = getSession().createSQLQuery(sql);
query.executeUpdate();
hibernate更新所有表的UpdateTimestampsCache。他为什么要这么做?我的应用程序中有大约1000个表和许多sql查询。我不需要这个更新,因为我不通过sql更新缓存表。这会导致巨大的网络流量和应用程序的速度变慢。
有没有办法告诉hibernate在运行sql查询时不要做任何更新?
发布于 2012-02-13 14:39:29
我找到解决方案了!
您可以使用addSynchronizedEntityClass()方法
String sql = "update SOME_TABLE set SOME_FIELD=somevalue";
SQLQuery query = getSession().createSQLQuery(sql);
query.addSynchronizedEntityClass(SomeTable.class)
query.executeUpdate();
在这种情况下,它将仅重置SOME_TABLE的缓存
发布于 2011-12-12 16:08:45
您可以尝试使用StatelessSession而不是普通会话。你也可以直接使用JDBC代替hibernate的createSQLQuery方法。
另一种选择是使用HQL update query而不是SQL。这可能能够找出您正在更新哪个实体,并且只会使该查询的查询结果无效。当您触发SQL查询时,hibernate不知道正在更新哪个表-所以为了安全起见,它会将所有查询缓存结果标记为无效。
https://stackoverflow.com/questions/8477126
复制