hibernate二級快取

2021-08-31 14:28:52 字數 3364 閱讀 6023

自:

二級快取稱為程序級快取或sessionfactory級快取,它可以被所有session共享,它的生命週期伴隨著sessionfactory的生命週期存在和消亡。

第一步:複製ehcache.xml檔案到src目錄下,配置二級快取

/>

也可以配置某個特定物件的,如(但一般情況是使用預設的就可以了):

第二步:啟用二級快取

1.啟用二級快取,預設是啟用的:

true

2.設定快取產品,如:

org.hibernate.cache.ehcacheprovider

3.指定哪些類使用二級快取(兩種方法):

a.在hibernate.cfg.xml配置檔案中定義

如:b.在對映檔案中定義

如:在節點下:

有些類設定二級快取,有些類不設定二級快取;所以如果在對映檔案中定義二級快取的話會導致標籤遍布在檔案中,

因此常用第一種,即在hibernate.cfg.xml配置檔案中定義,這樣便於維護和管理。

第三步:二級快取例項

1.開啟兩次session,呼叫load查詢

**部分:

session session = this.sf.opensession();

user u1 = (user) session.load(user.class, 1);

system.out.println("使用者姓名:"+u1.getname());

//關閉seeion,釋放一級快取

session.close();

//重新開啟session

session = this.sf.opensession();

user u = (user) session.load(user.class, 1);

system.out.println("使用者姓名:"+u.getname());

session.close();

執行部分:

如果設定false,執行結果如下:

hibernate:

select

user0_.id as id0_0_,

user0_.name as name0_0_,

user0_.password as password0_0_,

user0_.createtime as createtime0_0_,

user0_.expiretime as expiretime0_0_

from

t_user user0_

where

user0_.id=?

使用者姓名:wangwu

hibernate:

select

user0_.id as id0_0_,

user0_.name as name0_0_,

user0_.password as password0_0_,

user0_.createtime as createtime0_0_,

user0_.expiretime as expiretime0_0_

from

t_user user0_

where

user0_.id=?

使用者姓名:wangwu

如果設定true,執行結果如下:

hibernate:

select

user0_.id as id0_0_,

user0_.name as name0_0_,

user0_.password as password0_0_,

user0_.createtime as createtime0_0_,

user0_.expiretime as expiretime0_0_

from

t_user user0_

where

user0_.id=?

使用者姓名:wangwu

使用者姓名:wangwu

可見,二級快取是起作用了的。用get測試是同樣的結果

2.在1的**中加入this.sf.evict(user.class),清除二級快取中的物件,執行結果就跟設定了false的效果相同。

當然也可以指定清除哪些物件:this.sf.evict(user.class,1),結果很簡單。

3.一級快取和二級快取的互動(cachemode:cachemode.normal、cachemode.put、cachemode.get)

**部分:

session session = this.sf.opensession();

只向二級快取中讀資料不寫

session.setcachemode(cachemode.get); ……1

user u1 = (user) session.load(user.class, 1); ……2

//**1和**2順序不能顛倒,否則cachemode.get對1號使用者不起作用

system.out.println("使用者姓名:"+u1.getname());

session.close();

//重新開啟session

session = this.sf.opensession();

user u = (user) session.load(user.class, 1);

system.out.println("使用者姓名:"+u.getname());

session.close();

執行結果:

hibernate:

select

user0_.id as id0_0_,

user0_.name as name0_0_,

user0_.password as password0_0_,

user0_.createtime as createtime0_0_,

user0_.expiretime as expiretime0_0_

from

t_user user0_

where

user0_.id=?

使用者姓名:wangwu

hibernate:

select

user0_.id as id0_0_,

user0_.name as name0_0_,

user0_.password as password0_0_,

user0_.createtime as createtime0_0_,

user0_.expiretime as expiretime0_0_

from

t_user user0_

where

user0_.id=?

使用者姓名:wangwu

預設情況下又讀又寫,即為cachemode.normal

cachemode.put只寫不讀

hibernate二級快取

cacheconcurrencystrategy.none cacheconcurrencystrategy.read only 唯讀模式,在此模式下,如果對資料進行更新操作,會有異常 cacheconcurrencystrategy.read write 讀寫模式在更新快取的時候會把快取裡面的資料...

hibernate 二級快取

session快取 一級快取 sql查詢結果快取,由hibernate管理 sessionfactory內建快取,內建快取是hibernate自帶的,用於存放預定義的sql以及hbm.xml描述的元資料,不可解除安裝 sessionfactory外接快取 二級快取 由外部外掛程式提供,外接快取的資料...

Hibernate二級快取

hibernate的session在事務級別進行持久化資料的快取操作。當然,也有可能分別為每個類 或集合 配置集群 或jvm級別 sessionfactory級別 的快取。你甚至可以為之插入乙個集群的快取。注意,快取永遠不知道其他應用程式對持久化倉庫 資料庫 可能進行的修改 即使可以將快取資料設定為...