Hibernate之二級緩存

1.一級緩存的作用域是一個session的范圍

2.使用二級緩存的步驟

··hibernate并沒有提供相應(yīng)的二級緩存的組件馒索,所以需要加入額外的二級緩存包曹体,常用的二級緩存包是ECHcache

在hibernate.cfg.xml中配置開啟二級緩存

<propertyname="hibernate.cache.use_second_level_cache">true</property>

設(shè)置二級緩存所提供的類

<propertyname="hibernate.cache.provider_class">

net.sf.ehcache.hibernate.EhCacheProvider</property>

在hibernate4.0之后需要設(shè)置facotory_class

<property name="hibernate.cache.region.factory_class">

org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

說明ehcache的配置文件路徑

<property name="hibernate.cache.provider_configuration_file_resource_path">

ehcache.xml</property>

ehcache.xml

應(yīng)用二級緩存:

在xml的配置文件中設(shè)置二級緩存

try {

//此時會發(fā)出一條sql取出所有的學(xué)生信息

session = HibernateUtil.openSession();

Student stu = (Student)session.load(Student.class, 1);

System.out.println(stu.getName()+",---");

} catch (Exception e) {

e.printStackTrace();

} finally {

HibernateUtil.close(session);}

try {

session = HibernateUtil.openSession();

session.beginTransaction();

//此時session已經(jīng)關(guān)閉了色瘩,但是Student在二級緩存中单绑,所以也不會發(fā)出SQL語句

Student stu = (Student)session.load(Student.class, 1);

//會報錯嘱函,因為二級緩存設(shè)置為read-only

// stu.setName("abc");

System.out.println(stu.getName()+",---");

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

} finally {

HibernateUtil.close(session);}

二級緩存緩存的是對象币厕,它是把所有的對象緩存到內(nèi)存中列另,一定注意是基于對象的緩存

try {/** * 此時會發(fā)出一條sql取出所有的學(xué)生信息 */

session = HibernateUtil.openSession();

List<Object[]>ls = session.createQuery("select stu.id,stu.name from Student stu")

.setFirstResult(0).setMaxResults(50).list();

} catch (Exception e) {

e.printStackTrace();

} finally {

HibernateUtil.close(session);}

try {

session = HibernateUtil.openSession();

session.beginTransaction();

//以上代碼僅僅取了id和name,而二級緩存是緩存對象的旦装,所以上一段代碼不會將對象加入二級緩存

*此時就是發(fā)出相應(yīng)的sql

Student stu = (Student)session.load(Student.class, 1);

//會報錯页衙,因為二級緩存設(shè)置為read-only

// stu.setName("abc");

System.out.println(stu.getName()+",---");

session.getTransaction().commit();

} catch (Exception e) {

e.printStackTrace();

} finally {

HibernateUtil.close(session);}


try {

/** * 此時會發(fā)出一條sql取出所有的學(xué)生信息 */

session = HibernateUtil.openSession();

List<Student>ls = session.createQuery("select stu from Studentstu").setFirstResult(0).setMaxResults(50).list();}

catch (Exception e) {

e.printStackTrace();}

finally {HibernateUtil.close(session);}

try {

session = HibernateUtil.openSession();

/** * 由于學(xué)生的對象已經(jīng)緩存在二級緩存中了,此時再使用iterate來獲取對象的時候,首先會通過一條 取id的語句店乐,然后在獲取對象時去二級緩存中艰躺,如果發(fā)現(xiàn)就不會再發(fā)SQL,這樣也就解決了N+1問題? 而且內(nèi)存占用也不多 */

Iteratorstus = session.createQuery("from Student")

.setFirstResult(0).setMaxResults(50).iterate();

for(;stus.hasNext();) {

Student stu = stus.next();

System.out.println(stu.getName());}

} catch (Exception e) {

e.printStackTrace();

} finally {

HibernateUtil.close(session);}

try {

/** * 此時會發(fā)出一條sql取出所有的學(xué)生信息 */

session = HibernateUtil.openSession();

List<Student>ls = session.createQuery("select stu from Student stu").setFirstResult(0).setMaxResults(50).list();}

catch (Exception e) {e.printStackTrace();}

finally {HibernateUtil.close(session);}

try {session = HibernateUtil.openSession();

/** * 使用List會發(fā)出兩條一模一樣的sql眨八,此時如果希望不發(fā)sql就需要使用

查詢緩存 */

List<Student>ls = session.createQuery("select stu from Studentstu").setFirstResult(0).setMaxResults(50).list();

Iterator<Student>stus = ls.iterator();

for(;stus.hasNext();) {

Student stu = stus.next();

System.out.println(stu.getName());}

} catch (Exception e) {

e.printStackTrace();

} finally {

HibernateUtil.close(session);}

查詢緩存是針對HQL語句的緩存腺兴,查詢緩存僅僅只會緩存id而不會緩存對象,

查詢緩存未完待續(xù)....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市廉侧,隨后出現(xiàn)的幾起案子页响,更是在濱河造成了極大的恐慌,老刑警劉巖段誊,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闰蚕,死亡現(xiàn)場離奇詭異,居然都是意外死亡连舍,警方通過查閱死者的電腦和手機没陡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來索赏,“玉大人盼玄,你說我怎么就攤上這事∏蹦澹” “怎么了强岸?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砾赔。 經(jīng)常有香客問我蝌箍,道長,這世上最難降的妖魔是什么暴心? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任妓盲,我火速辦了婚禮,結(jié)果婚禮上专普,老公的妹妹穿的比我還像新娘悯衬。我一直安慰自己,他們只是感情好檀夹,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布筋粗。 她就那樣靜靜地躺著,像睡著了一般炸渡。 火紅的嫁衣襯著肌膚如雪娜亿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天蚌堵,我揣著相機與錄音买决,去河邊找鬼沛婴。 笑死,一個胖子當著我的面吹牛督赤,可吹牛的內(nèi)容都是我干的嘁灯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躲舌,長吁一口氣:“原來是場噩夢啊……” “哼丑婿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起没卸,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枯冈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后办悟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡滩褥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年病蛉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑰煎。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡铺然,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酒甸,到底是詐尸還是另有隱情魄健,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布插勤,位于F島的核電站沽瘦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏农尖。R本人自食惡果不足惜析恋,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盛卡。 院中可真熱鬧助隧,春花似錦、人聲如沸滑沧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滓技。三九已至哩牍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間令漂,已是汗流浹背姐叁。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人外潜。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓原环,卻偏偏與公主長得像,于是被迫代替她去往敵國和親处窥。 傳聞我的和親對象是個殘疾皇子嘱吗,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法滔驾,內(nèi)部類的語法谒麦,繼承相關(guān)的語法,異常的語法哆致,線程的語...
    子非魚_t_閱讀 31,630評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評論 0 11
  • true try {/** * 此時會發(fā)出一條sql取出所有的學(xué)生信息 */session = Hibernate...
    昵稱已被占用了啊閱讀 149評論 1 0
  • 一摊阀、簡介 二級緩存也稱進程級的緩存或SessionFactory級的緩存耻蛇,二級緩存可以被所有的session共享。...
    yjaal閱讀 1,327評論 0 1
  • 今天看陳舜臣的《十八史略》里面的一篇《鬼谷先生》,故事大意如下: 鬼谷先生來歷不詳漱牵,門下第一和第二弟子分別是蘇秦和...
    余語閱讀 326評論 0 2