什么是缓存
Hibernate缓存
1、hibernate缓存的一级缓存:
①hibernate一级缓存是默认打开的。
②hibernate一级缓存有使用范围,session范围(session的创建和关闭范围)。
③hibernate一级缓存中存储数据必须是持久态数据。
2、根据id=6查询,第二次再根据id=6查询。
User user1 = session.get(User.class,6);
User user2 = session.get(User.class,6);
第一次执行查询向数据库发出sql语句,若第二次执行和第一次查询相同的内容,第二次没有发出sql,查询的是一级缓存的内容。
首先,查询一级缓存:
①一级缓存发现没有数据,才去查数据库,返回user对象(持久态)。其次,把user对象放到一级缓存中(把user的对象的所有值存放到缓存中,给这个存放user对象值的空间称为id=6)。
②一级缓存发现相同数据,直接返回(缓存中发现有id=6,直接返回)。
3、一级缓存的特性:
①持久态会自动更新数据库。例如:user为持久态,没有session.update(user)时也可以在数据库修改。
User user = session.get(User.class,6);
user.setUsername("sam");
//session.update(user);
ts.commit();
原理:
a.当创建session时会有一级缓存,对应一级缓存创建个快照区(副本),把返回的user持久态对象放到一级缓存中,同时把user对象放到一级缓存对应的快照区里面。
b.当修改user持久态对象里面的值时,同时修改一级缓存中的内容,但是不会修改一级缓存快照区的内容。
c.提交事务的时候,比较以及缓存和对应快照区内容是否相同,
若不同,把一级缓存内容更新到数据库里面。
若相同,不会更新到数据库里面。
4、hibernate绑定session
获取与本地线程绑定的session,(获取与本地线程绑定的session时,关闭session不会报错,线程结束,session会自动关闭,不需要手动关闭):
<property name="hibernate.crrent_session_context_class">thread</property>
②用sessionFactory得到:
sessionFactory.getCurrentSess();
5、hibernate事务操作
事务的特性:
try{
开启事务;
提交事务
}catch(){
回滚事务;
}finally{
关闭;
}
不考虑隔离性产生的问题:脏读、不可重复读、虚读。
脏读:一个事务读到另一事务未提交的更新数据。
虚读:一个事务读到另一事务已提交的新插入的数据。
不可重复读:一个事务读到另一事务已提交的更新数据。
设置事务隔离级别:mysql默认隔离级别:repeatable read。
<session-factory>
<!-- 设置数据库的事务隔离级别 -->
<property name="hibernate.connection.isolation">2</property>
</session-factory>
数据库隔离级别(由低到高)
读未提交(Read Uncommitted)对应hibernate配置值 1
读已提交(Read Committed)对应hibernate配置值 2
可重复读(Repeatable Read)对应hibernate配置值 4
可串行化(Serializable)对应hibernate配置值 8