Hibernate--一級緩存--事務

一 什么是緩存
1 數(shù)據(jù)存到數(shù)據(jù)庫里面,數(shù)據(jù)庫本身是文件系統(tǒng)泼橘,使用流方式操作文件效率不是很高。
(1)把數(shù)據(jù)存到內(nèi)存里面迈勋,不需要使用流方式炬灭,可以直接讀取內(nèi)存中數(shù)據(jù)
(2)把數(shù)據(jù)放到內(nèi)存中,提供讀取效率
2 Hibernate緩存
(1)hibernate框架中提供很多優(yōu)化方式靡菇,hibernate的緩存就是一個優(yōu)化方式
(2)hibernate緩存特點:

  • hibernate的一級緩存

    • hibernate的一級緩存默認就是打開的
    • hibernate的一級緩存使用范圍重归,是session范圍
    • hibernate的一級緩存中,存儲數(shù)據(jù)必須 持久態(tài)數(shù)據(jù)
  • hibernate的二級緩存

    • 目前已經(jīng)不使用了厦凤,替代技術(shù) redis
    • 二級緩存默認不是打開的鼻吮,需要配置
    • 二級緩存使用范圍,是sessionFactory范圍

3 驗證一級緩存

  • 首先根據(jù)id=1查詢较鼓,返回對象
  • 其次在根據(jù)id=2查詢椎木,返回對象
import Utils.HibernateUtils;
import entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

public class HibernateSelect {
    @Test
    public void testCasch(){
        //調(diào)用工具類得到sessionFactory
       SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
       //獲取session
        Session session = sessionFactory.openSession();
        //開啟事務
        Transaction tx = session.beginTransaction();
        //1 根據(jù)id=3查詢
         User user = session.get(User.class,1);
        System.out.println(user);
        //2 在根據(jù)id = 3查詢
         User user1= session.get(User.class,1);
        System.out.println(user1);
        //提交事務
        tx.commit();
        //關(guān)閉
        session.close();
        sessionFactory.close();

    }
}
執(zhí)行結(jié)果

說明:
第一步執(zhí)行g(shù)et方法之后,發(fā)送sql語句查詢數(shù)據(jù)庫
第二步執(zhí)行g(shù)et方法之后笨腥,沒有發(fā)送sql語句拓哺,查詢一級緩存內(nèi)容

4 Hibernate一級緩存特性

  • 持久態(tài)自動更新
代碼
執(zhí)行結(jié)果
數(shù)據(jù)庫

二 hibernate的事務操作
1 概念
2 事務特性
3 不考慮隔離性產(chǎn)生問題

  • 臟讀
  • 不可重復讀
  • 虛讀

4 解決

  • 設(shè)置事務隔離級別

三 事務代碼規(guī)則寫法

Try{
    開啟事務
    提交事務 
}catch (){
     回滾事務  
}finally{
   }

樣例

import Utils.HibernateUtils;
import entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

public class HibernateTx {
    @Test
    public void Tx(){
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try{
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.openSession();
            tx= session.beginTransaction();
            User user = new User();
            user.setName("大偉");
            user.setPassword("666666");
            session.save(user);
            tx.commit();
        }catch (Exception e){
            e.printStackTrace();
            tx.rollback();
        }finally {
            session.close();
            sessionFactory.close();
        }
    }
}

四 Hibernate綁定session
1 session類似于jdbc的connection,之前web階段學過threadLocal
2 Hibernate幫實現(xiàn)與本地線程綁定session
3 獲取與本地線程session
(1)在hibernate核心配置文件中配置

        <!--在hibernate核心配置文件中配置-->
        <property name="hibernate.current_session_context_class">thread</property>

(2)調(diào)用sessionFactory里面的方法得到

    //提供返回與本地線程綁定的session的方法
    public static Session getSessionObject(){
        return sessionFactory.getCurrentSession();
    }

(3)測試

import Utils.HibernateUtils;
        import entity.User;
        import org.hibernate.Session;
        import org.hibernate.SessionFactory;
        import org.hibernate.Transaction;
        import org.junit.Test;

public class HibernateTx {
    @Test
    public void Tx(){
        Session session = null;
        Transaction tx = null;
        try{
            //與本地線程綁定的session
            session = HibernateUtils.getSessionObject();
            tx= session.beginTransaction();
            User user = new User();
            user.setName("小偉");
            user.setPassword("789456");
            session.save(user);
            tx.commit();
        }catch (Exception e){
            e.printStackTrace();
            tx.rollback();
        }finally {
            session.close();
            //sessionFactory.close();
        }

    }
}
執(zhí)行結(jié)果
查看數(shù)據(jù)庫

雖然報錯脖母,我們卻發(fā)現(xiàn)數(shù)據(jù)里面有了數(shù)據(jù)
解釋:使用與本地線程綁定的session士鸥,在線程結(jié)束的時候會隨著線程的結(jié)束自動關(guān)閉,不需要我們手動關(guān)閉了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谆级,一起剝皮案震驚了整個濱河市烤礁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肥照,老刑警劉巖脚仔,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舆绎,居然都是意外死亡鲤脏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猎醇,“玉大人窥突,你說我怎么就攤上這事×蛩唬” “怎么了阻问?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沦疾。 經(jīng)常有香客問我称近,道長,這世上最難降的妖魔是什么哮塞? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任刨秆,我火速辦了婚禮,結(jié)果婚禮上忆畅,老公的妹妹穿的比我還像新娘坛善。我一直安慰自己,他們只是感情好邻眷,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剔交,像睡著了一般肆饶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岖常,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天驯镊,我揣著相機與錄音,去河邊找鬼竭鞍。 笑死板惑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的偎快。 我是一名探鬼主播冯乘,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晒夹!你這毒婦竟也來了裆馒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤丐怯,失蹤者是張志新(化名)和其女友劉穎喷好,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體读跷,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡梗搅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无切。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡荡短,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出订雾,到底是詐尸還是另有隱情肢预,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布洼哎,位于F島的核電站烫映,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏噩峦。R本人自食惡果不足惜锭沟,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望识补。 院中可真熱鬧族淮,春花似錦、人聲如沸凭涂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽切油。三九已至蝙斜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澎胡,已是汗流浹背孕荠。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留攻谁,地道東北人稚伍。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像戚宦,于是被迫代替她去往敵國和親个曙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

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