Hibernate的一级缓存
什么是缓存
1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
(2)把数据放到内存中,提供读取效率
Hibernate缓存
1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
2 hibernate缓存特点
第一类 hibernate的一级缓存
(1)hibernate的一级缓存默认就是打开的
(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须 持久态数据
第二类 hibernate的二级缓存
(1)目前不使用了,替代技术 redis
(2)二级缓存默认不是打开的,需要进行配置
(3)二级缓存使用范围,是sessionFactory范围
验证一级缓存存在
1 验证方式
(1)首先根据uid=1查询,返回对象
(2)其次再根据uid=1查询,返回对象
@Test
public void testCache() {
SessionFactory sessionFactory=HibernateUtils.getSessionFactory();
Session session=sessionFactory.openSession();
Transaction tx=session.beginTransaction();
//1根据uid=5进行查询
//执行第一个get方法是否查询数据库,是否发送sql语句
User user=session.get(User.class, 5);
System.out.println(user);
//2根据uid=5进行查询
//执行;第二个get方法是否查询数据库,是否发送sql语句
User user2=session.get(User.class, 5);
System.out.println(user2);
tx.commit();
session.close();
sessionFactory.close();
}
第一步执行get方法之后,发送sql语句,查询一级缓存内容
第二个执行get方法之后,没有发送sql语句,查询一级缓存内容
运行结果如下所示:
一级缓存执行过程
Hibernate一级缓存特性
1 持久态自动更新数据库
public class HibernateSelect {
@Test
public void testDemo() {
SessionFactory sessionFactory=HibernateUtils.getSessionFactory();
Session session=sessionFactory.openSession();
Transaction tx=session.beginTransaction();
//1根据uid=5进行查询
//执行第一个get方法是否查询数据库,是否发送sql语句
User user=session.get(User.class, 5);
System.out.println(user);
//2设置返回值
user.setUsername("韩梅梅");
//3 调用方法实现
//session.update(user);
tx.commit();
session.close();
sessionFactory.close();
}
}
2 执行过程(了解)
HIbernate事务操作
事务相关概念
1 什么是事务
事务是操作中的基本单元,事务中的操作,要么都成功,要么都失败。比如:银行转账
2 事务特性
acid,原子性,一致性,隔离性,持久性。
3 如果不考虑隔离性
(1)脏读,
(2)不可重复读
(3)虚读
4 设置事务隔离级别
(1)mysql默认隔离级别repeatable_read
Hibernate 事务规范代码写法
1 代码结构
try{
开启事务,
提交事务
}catch(){
回滚事务
}finally{
关闭
}
//事务规范代码
@Test
public void testTx() {
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
sessionFactory=HibernateUtils.getSessionFactory();
session=sessionFactory.openSession();
tx=session.beginTransaction();
User user=new User();
user.setUsername("马云");
user.setPassword("778");
user.setAddress("杭州");
session.save(user);
int i=10/0;
//提交事务
tx.commit();
}
catch(Exception e){
tx.rollback();
}finally {
session.close();
sessionFactory.close();
}
}