Chad
2009年3月29日
问题描述如下,
情景1:
系统运行中,在外部通过工具修改数据库数据后,系统当一直无法得到最新数据。
情景2:
App1用hibernate来做数据存取,App2直接操作数据库,App2对数据库数据操作的结果,无法在App1在得到。
试图用以下方法解决,都告失败:
1. 重新生成一个Session实例. Failed!
2. 关于query cache, second-level cache. Failed!
3. Session.flush, Session.clear都不好用. Failed!
接着找到几种方法可行:
1. 每次重新生成sessionfactory。<糟糕至极>
2. 把查询放到transaction当中。<理论上不通>
3. 设置hibernate的配置属性:connection.autocommit=true
虽然找到办法,但对该办法到底产生了什么作用还是不太了解。于是查看Hibernate的code。看看这些属性到底在哪里发挥了作用。结果,找来找去,该属性竟然没有被用到hibernate的缓存配置当中。最后,发现,它其实是用到了java.sql.Connection当中去。Hibernate在查询过程当中,用到了java.sql.PreparedStatement, 对于这个类,我们通过试验可以发现,如果你把connection的auto commit设置为false时,用同一个connection在数据更改前和理性后取都是一样的。只有把auto commit设置为true或用两个事务来取值,才能取回来不同的数据。