一級緩存
* 一級緩存是緩存實體對象的
* 如果管理一級緩存
一級緩存無法取消,但可以管理clear(),evict()
* 一級緩存和session的生命周期一致,一級緩存也叫session級的緩存或事務級緩存
* 如何避免一次性大量的實體數據入庫導至內存溢出
先flush,再clear
* 如何管理一級緩存
load,get,iterate,save都支持一級緩存
如果數據量特別大,考慮采用jdbc實現,如查jdbc也不能滿足要求可以考慮采用數據本身的特定導入工具
Student student=(Student)session.load(Student.class,1);
System.out.println("studnet.name="+student.getName());
//不會發出sql,因為load使用緩存
Student student=(Student)session.load(Student.class,1);
System.out.println("studnet.name="+student.getName());
二級緩存
* 二級緩存是緩存實體對象的,普通屬性不會緩存
* 二級緩存是進程級的緩存,也稱為SessionFactory級的緩存,可以被所有的session共享
二級緩存的生命周期和SessionFactory是一致的,可以用SessionFactory管理二級緩存
* 二級緩存的配置和使用
1 加入ehcache的jar包;
2 拷貝ehcache.xml文件到src目錄下;
3 開啟二級緩存,默認是打開的。配置hibernate.cfg.xml
hibernate.cfg.xml文件
開啟二級緩存
<property name="hibernate.cache.use_second_level_cache">true</property>
指定緩存產品提供商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
4 指定那些對象使用二級緩存(兩種方運河)
* 在映射文件中采用<cache>標簽
<class name="com.my.hibernate.User" table="t_user">
<cache usage="read-only"/>
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="group" column="groupid" cascade="save-update"/>
</class>
* 在hibernate.cfg.xml文件中,采用<class-cache/>標簽
<class-cache class="com.bjsxt.hibernate.Studnet" usage="read-only"/>
管理二級緩存
factory.evict(Student.class);
factory.evict(Student.class,1);
一級緩存和二級緩存的交互問題
1 不設置(默認)會寫入二級緩存,也會讀出
2 GET只讀而不寫入二級緩存
session.setCacheMode(CacheMode.GET);
Student student=(Student)session.load(Student.class,1);
3 PUT只寫入二級緩存頁不讀取
session.setCacheMode(CacheMode.PUT);
Student student=(Student)session.load(Student.class,1);
查詢緩存
查詢緩存是針對普通屬性結果集的緩存
對實體對象的結果只緩存id
查詢緩存的生命周期,當前關聯的表發生修改,那么查詢緩存生命周期結束
查詢緩存的配置和使用
1 起用查詢緩存
* 配置hibernate.cfg.xml文件
<property name="hibernate.cache.use_second_level_cache">true</property>
* 在程序中顯式起用
query.setCacheable(true);
2 Session和查詢緩存生命周期沒有關系
3 查詢緩存對query.iterate()不起作用,只用對query.list()起作用
posted on 2009-11-03 16:49
junly 閱讀(336)
評論(0) 編輯 收藏 所屬分類:
hibernate/orm