Hibernate脏数据

本文探讨了使用Hibernate框架时遇到的一级缓存问题,尤其是在Tomcat环境下,不同线程间的数据状态不一致现象。提供了两种解决方案:清理一级缓存和采用HibernateFactory的getCurrentSession方法。
摘要由CSDN通过智能技术生成

今天在使用hibernate向数据库中提交一份更新或者插入的时候,表面上是成功的执行了,而且刷新数据库也看见了数据元组中的项确实是改变了,但是当刷新Web页面使后台逻辑重新加载的时候,会时不时的发现bean的状态是外改动的状态,用统计学的方法统计了一下,正常与不正常的几率五五开。

这可能是由于tomcat这类容器的线程调度功能造成,以前我是用的HibernateUtil和ThreadLocal来实现线程内的session同步,但是当一个线程内对应的session刚刚执行完修改数据的操作之后,另一个线程(可能被分配来select数据库并显示)中的session并不能察觉到脏数据,导致界面上呈现出来的数据是为修改之前的,而当用户刷新Web浏览器的时候,有可能会分配之前的第一个线程来进行渲染界面,这就导致了显示了正常的结果,如此交替往复,可能就是我遇到的这个现象的原因了。

因此解决方法也不难,这里有两种:

1、在不改变HibernateUtil的前提下,不修改过多的代码,只需在查询之前session.clear()一下来手动清空一级缓存,伴送着性能的下降(下降很多倍),这个奇怪的现象也就不存在了,但是我还是不喜欢用这个方法,这个方法太类似于打补丁了,不能完全从本质上解决Hibernate一缓问题。

2、使我最近在用的,虽然性能还是不怎么滴。。。就是用HibernateFactory中的getCurrentSession方法取得一个session,这个方法已经成功封装了上面所说的HibernateUtil,而且里面可能做了一些其他操作,我最近一直在使用这个方法,并没有发现以前那种奇奇怪怪的bug。希望明白原理的大佬不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值