国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php框架 > 框架设计 > 【Java基础】Hibernate的缓存机制以及延迟加载

【Java基础】Hibernate的缓存机制以及延迟加载

来源:程序员人生   发布时间:2015-05-05 07:41:30 阅读次数:3813次

    上篇博客介绍了Hibernate的基本原理,在博客尾声的时候提到了Hibernate的缓存机制和延迟加载问题,这篇博客我们继续,将这两部份的内容补充完。


    首先说说Hibernate的缓存机制,我们都知道Hiernate有1级缓存、2级缓存,但是具体的机制原理了解的清楚吗?这里我们就来好好说说Hibernate的缓存机制。先说说为何要用缓存机制?Hibernate是1个持久层框架,常常访问物理数据库,为了下降利用程序对数据源访问的频次,从而提高利用程度的运行性能。缓存内的数据是对物理数据源中的数据的复制,利用程序在运行时从缓存中读写数据,在特定时间或事件中的会同步缓存和物理数据源的数据。


    介绍完Hibernate缓存的作用,下面说说Hibernate缓存的分类了其实我们上面都说了,Hibernate缓存分为1级缓存和2级缓存。Hibernate的1级缓存 又称为“Session的缓存”,它是内置的,不能被卸载,这里面的不能卸载的意识是这类缓存不具有可选性,是必须有的功能,是不能被取消的。由于Session对象的生命周期通常对应1个数据库事务或1个利用事务,因此它的缓存是事务范围内的缓存。1级缓存是必须的,不允许而且事实上也没法卸除。在1级缓存中,持久化类的每个实例都具有唯1的OID。下面说2级缓存,Hibernate的2级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和利用程序的全部进程对应,因此Hibernate的2级缓存是进程范围或集群范围的缓存。有可能出现并提问题,因此需要采取适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别,2级缓存是可选的,相对1级缓存而言它是1个可配置的插件,在默许情况下,SessionFactory不会启用这个插件。


    那末甚么样的数据合适存在2级缓存中呢?第1、很少被修改的数据;第2、不是很重要的数据,允许出现偶尔并发的数据;第3、不会被并发访问的数据;第4、常量的数据。那末相对而言甚么样的数据不合适寄存在2级缓存中呢?第1、常常被修改的数据;第2、绝对不允许出现并发访问的数据,如财务数据;第3、与其他利用程序同享的数据。


    那末具体是如何利用缓存机制的呢?我们来举个例子,比如说当Hibernate根据ID访问数据对象的时候,它会首先从Session1级缓存中去查,如果查不到,如果配置了2级缓存,就去2级缓存中去查;如果还查不到,那末就去数据库中查,把结果依照ID放入到缓存中。删除、更新、增加数据的时候,同时更新缓存。


    好了,Hibernate的缓存机制就介绍了到这里,下面我们说说Hibernate的延迟加载。Hibernate的延迟加载是非常经常使用的技术。先说延迟加载的概念,延迟加载时只有真正使用该对象时才会创建,对Hibernate而言,它是支持延迟加载的,也称为懒加载,是在真正使用对象的时候才会发送sql语句,查询对象的时候不会发送sql语句。Hibernate通过这类延迟加载开下降系统的内存开消,从而保证Hibernate的运行性能。


    Hibernate主要听过代理Proxy机制来实现延迟加载,具体的进程是Hibernate从数据库中获得某1个对象数据或某1个对象的集合属性值或获得某1个对象所关联的另外一个对象时,由于没有使用该对象的数据,Hibernate其实不是从数据库加载真实的数据,而只是为该对象创建1个代理对象来代表这个对象,这个对象上的所有属性都是默许值。只有在真正需要使用该对象的数据时才创建这个真实对象,真正从数据库中加载它的数据,这样在某些情况下,可以提高查询效力。


    get方法不支持延迟加载,get方法在查询不到对象时不会出现异常。与之对应的load方法支持延迟加载,load在查询不到对象时会抛出异常。举个例子说明1下,现在我们都知道了Hibernate的延迟加载会下降系统的内存开消,在某些程度上却是会给程序的查询效力带来好处,但有时候明确知道数据需要立刻被加载,如果Hibernate先默许使用延迟加载,随后又必须去数据库加载,反而会下降效力。这个时候怎样办?记住上面说的,get方法是不支持延迟加载的,如果在加载单个实体时,如果不需要延迟加载,就能够使用session的get()方法。提到session又想到了,Hibernate支持延迟加载必须在session开启的情况下才有效。


    对Hibernate的延迟加载的基本介绍先到这里,研究的还不是特别深入,在以后的利用中会渐渐更新这方面的文章。个人觉得缓存机制和延迟加载是Hibernate中比较重要的知识点,需要很好的掌握。其实深挖东西是挺多的,欢迎大家提宝贵意见,欢迎留言我们1起沟通交换。

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生