今天在使用hibernate向数据库中提交一份更新或者插入的时候,表面上是成功的执行了,而且刷新数据库也看见了数据元组中的项确实是改变了,但是当刷新Web页面使后台逻辑重新加载的时候,会时不时的发现bean的状态是外改动的状态,用统计学的方法统计了一下,正常与不正常的几率五五开。
这可能是由于tomcat这类容器的线程调度功能造成,以前我是用的HibernateUtil和ThreadLocal来实现线程内的session同步,但是当一个线程内对应的session刚刚执行完修改数据的操作之后,另一个线程(可能被分配来select数据库并显示)中的session并不能察觉到脏数据,导致界面上呈现出来的数据是为修改之前的,而当用户刷新Web浏览器的时候,有可能会分配之前的第一个线程来进行渲染界面,这就导致了显示了正常的结果,如此交替往复,可能就是我遇到的这个现象的原因了。
因此解决方法也不难,这里有两种:
1、在不改变HibernateUtil的前提下,不修改过多的代码,只需在查询之前session.clear()一下来手动清空一级缓存,伴送着性能的下降(下降很多倍),这个奇怪的现象也就不存在了,但是我还是不喜欢用这个方法,这个方法太类似于打补丁了,不能完全从本质上解决Hibernate一缓问题。
2、使我最近在用的,虽然性能还是不怎么滴。。。就是用HibernateFactory中的getCurrentSession方法取得一个session,这个方法已经成功封装了上面所说的HibernateUtil,而且里面可能做了一些其他操作,我最近一直在使用这个方法,并没有发现以前那种奇奇怪怪的bug。希望明白原理的大佬不吝赐教。