hibernate读取内存的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate读取内存的问题相关的知识,希望对你有一定的参考价值。

在使用hibernate操作数据库的时侯,发现了一个很让我头疼的问题。就是,我在做项目的时候,本来数据已经通过hibernate对数据库的操作完成了对某个表的修改,可是紧接着用hibernate查询,却发现,还是原来的老数据!!查看数据库里的数据,明明都已经修改成功了啊。我用的是sqlserver数据库,所有数据都已经提交完成.可是查询的时候,有时候会显示新数据,有时候还是显示老数据.甚至更老的数据,但是发现一旦重启服务器,清空下内存,就可以正常显示数据库内的新数据了.我就在想,是不是因为hibernate对查询的结果一直放在内存里面,那样的话,就会导致页面经常会有数据不正确的情况.对现在的情况非常苦恼。希望您能抽出点时间帮我解答下。万分感激。

难得有人在这里问了个学术性的问题,不过建议你下次这类问题还是去csdn问,为什么不该在这里问你看看楼上的强悍答案就明白了吧。

hibernate为了提高数据存取效率提供了两级缓存,一级缓存将对象缓存在内存中避免过于频繁的数据库操作,二级缓存用于优化批量操作,你所描述的问题是由于没有理解一级缓存机制而造成的。

简单说一下,Hibernate的一级缓存是由Session提供的,它只存在于所属Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法时,如session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候缓存中的对象被清空并写入数据库。也可以调用flush()强制刷入缓存。另外,hibernate事务提交时也会把缓存种数据同步到数据库。

至于你说的问题“可是紧接着用hibernate查询,却发现,还是原来的老数据”,我估计你是用一个session写入数据库然后接着用另一个session去查询,这样第二个session是无法查询到第一个session的未真正写入数据库的数据的。如果在同一个session中这样的查询不会有问题,因为session查询的时候首先会刷入自己的缓存然后再执行查询操作,而对于get(id)方法则可以更简单地直接尝试在缓存中寻找。

知道了这些内容我想就能把握好hiberanate的使用流程了,不过你最好还是看看hibernate缓存机制,通常一级缓存在严格的多线程和分布式应用中才会遇到比较难解决的问题。如果你的情况跟我说的不同,那就贴出代码我帮你具体分析吧。
参考技术A 问题是这样产生的(楼主这样的问题我也遇到过),采用如下方法解决之
1、IIS启用了缓存;
2、IE游览器设置每次访问此页是检查
3、必要时可在ASP或者ASPX中加入页面自动失效检查
参考技术B 不使用延时加载和session应该就行了

Hibernate框架Hibernate的一级缓存

什么是缓存

1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。

1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据

2)把数据放到内存中,提供读取效率

 

Hibernate缓存

 

1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式

 

 

 

2 hibernate缓存特点:

 

第一类 hibernate的一级缓存

 

1hibernate的一级缓存默认打开的

 

2hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围

 

3hibernate的一级缓存中,存储数据必须 持久态数据

 

 

 

第二类 hibernate的二级缓存

 

1)目前已经不使用了,替代技术 redis

 

2)二级缓存默认不是打开的,需要配置

 

3)二级缓存使用范围,是sessionFactory范围

 

以上是关于hibernate读取内存的问题的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate框架Hibernate的一级缓存

Hibernate5.x缓存机制

HSQL 和 Hibernate - 许多删除语句上的内存不足错误

8.Hibernate性能优化

Hibernate 的SessionFactory

Hibernate(十六):Hibernate二级缓存