hibernate中的懒加载机制和缓存机制

懒加载:

    在hibernate中存在一些方法,例如:load方法。该方法在进行查询的时候并不会真正的去访问数据库,而是会先返回一个代理对象这个代理对象是new出来的,并不为null,代理对象中保存着我们要查询的条件,比如说:主键id。hibernate将代理对象返回出来,当你在使用代理对象访问真实对象的属性或者方法的时候,会触发代理对象的一个监听,从而去访问数据库查询真实对象的数据,hibernate会将数据注入到代理对象中的真实对象属性中。我们称这种方式为懒加载。

上述所说的代理对象是如何创建出来的呢?为什么它能够强制类型转换成真实的对象?
    在java中有一种模式叫做代理模式。实现的大概流程就是说当多个类,存在一个共同的接口的时候,就可以创建一个代理类去通用的访问他们所有类。

    但是这里我们实体类之间并没有共同的接口,所以这里又用到了一种技术:ASM。这个技术就比较有意思了,通常在java中一个类的字节码文件在编译的时候就被定好,而ASM正是打破了这种常规,它允许开发人员可以在运行期间动态的修改一个类,是不是和反射很像,但是它比反射更加的强大,它不仅可以动态的修改一个类的属性,方法;它甚至还能再一个类的基础之上再创建出来一个新的类。说到这里你是不是就明白为什么代理类能够强制类型转换成具体的实体类了,你可以理解成hibernate通过asm技术,动态的创建了一个查询实体类的子类,这个查询实体类的子类就是代理类,这个子类增加了很多额外的功能。



为什么需要懒加载?

    有人可能会问,为什么需要懒加载呢,不都是查数据吗?举个例子:假如你要查询100个对象,这100百个对象中可能只有几个对象需要被使用,而其他的对象你都不用。采用懒加载方式是不是就可以减少和数据库之间的访问,而且占用的数据库的空间也更少。
当然这个例子不是特别的恰当,如果这么多对象不用,我完全可以不去查询。



如果有一天我不想要使用懒加载,我想要使用传统模式的查询怎么办呢?
1、在实体类.hbm.xml文件中,实体类建立关系的节点中添加属性lazy=“false”。(会发送多条sql语句进行查询)
2、在实体类.hbm.xml文件中,实体类建立关系的节点中添加属性fetch=“join”。(只会发送一条sql语句,就像是表链接查询)。
3、在同一个session内,使用代理对象去访问真实对象中的属性或者方法。
4、在同一个session内,使用Hibernate.initialize(proxy);将懒加载的对象存储到内存中去。




缓存机制

hibernate中缓存机制是指将多次查询的数据按照一定的规则保存起来,而在下一次进行查询相同的数据就不用去访问数据库,就可以直接获取到了。

一级缓存
在hibernate中一级缓存是默认强制开启的,且不能禁用。
在hibernate中一级缓存是session范围级别的缓存,在同一个session范围内,如果多次查询同一个或者同一组对象,则只会在第一次查询的时候去访问数据库,然后会被缓存起来;当下一次也查询同一个或者同一组对象的时候,就会从一级缓存中读取数据,而不会去访问数据库读取数据了。

二级缓存
二级缓存是SessionFactory范围级别的缓存,需要手动的开启二级缓存。
在同一个SessionFactory范围内,如果多次查询同一个对象或者一组对象时,则只会在第一次查询的时候去访问数据库,然后会被缓存起来;当下一次也查询同一个对象或者一组对象时,就会从二级缓存中读取数据,而不会去访问数据库读取数据了。

二级缓存开启方式:
1、二级缓存需要导入响应的jar包。
2、配置二级缓存配置文件。
3、在hibernate.cfg.xml主配置文件中,开启二级缓存,配置二级缓存供应商,引用二级缓存配置文件。

查询缓存
当多次查询同一条sql语句,则只会在第一次查询的时候去访问数据库,然后会被缓存起来;当下一次也查询同一sql语句,并且约束的参数所有都相同的时候,就会从查询缓存中读取数据,而不会去访问数据库读取数据了。
查询缓存需要人为配置。




注意:级联查询默认使用懒加载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值