延迟加载!
什么是延迟加载?
延迟加载时一种优化,避免无所谓的性能开销,只有在真正需要使用数据的时候才会进行数据加载操作。
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了 对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。
延迟加载的优势以及讲解:
1、延迟加载的过程中先根据构造方法以及参数建立一个代理对象,调用到一定属性的时候执行里面的getXXX(),当执行到的getXXX()无法查询到值的时候,执行数据加载操作,也就是访问数据库,给代理对象对应属性赋值。如果没有使用延迟加载,代理对象这里会直接加载数据库,就是生成的代理对象为“最终代理对象”。
2、当加载的对象长时间不被使用的时候,该对象会被垃圾回收机制所回收
延迟加载策略原理图片:
应用程序----->代理:装载对象
代理----->数据库:调用代理方法
代理----->垃圾回收:长时间不调用
延迟加载优势就是节省系统内存空间。
使用延迟加载
1、采用延迟加载策略封的方法实现延迟加载的功能。例如load方法
Student s=session.load(Student.class,1);//1 System.out.println("name:"+s.getName());//2
在1,2分别断点可以见到延迟加载的现象
2、通过映射文件中的属性实现延迟加载
2.1设置映射文件中的<property>元素中的lazy属性实现延迟加载
<property name="name" type="string" lazy="true" > <column name="NAME"/> </property
2.2设置<class>标签的lazy属性实现延迟加载
<class name="com.hibernate.bean.Student" table="STUDENT" lazy="true"> <id name="id" type="int"> <column name="ID" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="description" type="java.lang.String"> <column name="DESCRIPTION" /> </property> </class>
2.3集合类型的延迟加载
集合类型的延迟加载:
在Hibernate的延迟加载机制中,针对集合类型的应用,意义是最为重大的,因为这有可能 使性能得到大幅度的提高,为此Hibernate进行了大量的努力,其中包括对JDK Collection的独立实现,我们在一对多关联中,定义的用来容纳关联对象的Set集合,并不是java.util.Set类型或其子类型,而是 net.sf.hibernate.collection.Set类型,通过使用自定义集合类的实现,Hibernate实现了集合类型的延迟加载。为了 对集合类型使用延迟加载,我们必须如下配置我们的实体类的关于关联的部分:
<hibernate-mapping> <class name=”com.neusoft.entity.User” table=”user”> ….. <set name=”addresses” table=”address” lazy=”true” inverse=”true”> <key column=”user_id”/> <one-to-many class=”com.neusoft.entity.Arrderss”/> </set> </class> </hibernate-mapping> 通过将<set>元素的lazy属性设置为true来开启集合类型的延迟加载特性。我们看下面的代码: User user=(User)session.load(User.class,”1”); Collection addset=user.getAddresses(); (1) Iterator it=addset.iterator(); (2) while(it.hasNext()){ Address address=(Address)it.next(); System.out.println(address.getAddress()); }
关于延迟加载的源码分析:
我没有深入,别人的链接:http://superleo.iteye.com/blog/243322/
延迟加载时代理模式的一种应用。