一 什么是缓存
1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
(2)把数据放到内存中,提供读取效率
2 Hibernate缓存
(1)hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
(2)hibernate缓存特点:
-
hibernate的一级缓存
- hibernate的一级缓存默认就是打开的
- hibernate的一级缓存使用范围,是session范围
- hibernate的一级缓存中,存储数据必须 持久态数据
-
hibernate的二级缓存
- 目前已经不使用了,替代技术 redis
- 二级缓存默认不是打开的,需要配置
- 二级缓存使用范围,是sessionFactory范围
3 验证一级缓存
- 首先根据id=1查询,返回对象
- 其次在根据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(){
//调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//获取session
Session session = sessionFactory.openSession();
//开启事务
Transaction tx = session.beginTransaction();
//1 根据id=3查询
User user = session.get(User.class,1);
System.out.println(user);
//2 在根据id = 3查询
User user1= session.get(User.class,1);
System.out.println(user1);
//提交事务
tx.commit();
//关闭
session.close();
sessionFactory.close();
}
}
执行结果
说明:
第一步执行get方法之后,发送sql语句查询数据库
第二步执行get方法之后,没有发送sql语句,查询一级缓存内容
4 Hibernate一级缓存特性
- 持久态自动更新
二 hibernate的事务操作
1 概念
2 事务特性
3 不考虑隔离性产生问题
- 脏读
- 不可重复读
- 虚读
4 解决
- 设置事务隔离级别
三 事务代码规则写法
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帮实现与本地线程绑定session
3 获取与本地线程session
(1)在hibernate核心配置文件中配置
<!--在hibernate核心配置文件中配置-->
<property name="hibernate.current_session_context_class">thread</property>
(2)调用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();
}
}
}
执行结果
查看数据库
虽然报错,我们却发现数据里面有了数据
解释:使用与本地线程绑定的session,在线程结束的时候会随着线程的结束自动关闭,不需要我们手动关闭了
网友评论