Hibernate--一級緩存--事務(wù)

一 什么是緩存
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();
        //開啟事務(wù)
        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);
        //提交事務(wù)
        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的事務(wù)操作
1 概念
2 事務(wù)特性
3 不考慮隔離性產(chǎn)生問題

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

4 解決

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

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

Try{
    開啟事務(wù)
    提交事務(wù) 
}catch (){
     回滾事務(wù)  
}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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容