一 什么是緩存
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í)行g(shù)et方法之后,發(fā)送sql語句查詢數(shù)據(jù)庫
第二步執(zhí)行g(shù)et方法之后笨腥,沒有發(fā)送sql語句拓哺,查詢一級緩存內(nèi)容
4 Hibernate一級緩存特性
- 持久態(tài)自動更新
二 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();
}
}
}
雖然報錯脖母,我們卻發(fā)現(xiàn)數(shù)據(jù)里面有了數(shù)據(jù)
解釋:使用與本地線程綁定的session士鸥,在線程結(jié)束的時候會隨著線程的結(jié)束自動關(guān)閉,不需要我們手動關(guān)閉了