一级缓存
Hibernate 会尝试尽可能长地延迟更新来减少发出的 SQL 更新语句的数目。如果你关闭 session,所有缓存的对象丢失,或是存留,或是在数据库中被更新。
二级缓存
第二级缓存是一种可选择的缓存并且第一级缓存在任何想要在第二级缓存中找到一个对象前将总是被询问。第二级缓存可以在每一个类和每一个集合的基础上被安装,并且它主要负责跨会话缓存对象。
任何第三方缓存可以和 Hibernate 一起使用。org.hibernate.cache.CacheProvider 接口被提供,它必须实现来给 Hibernate 提供一个缓存实现的解决方法。
举个栗子:我再购票的时候,比如出发地和目的地应该放在缓存里。
举个栗子:比如myeclipe比如我点一次,读取一下数据,或者文件中。
举个栗子:股票中,实时变化的信息也不能放在缓存中。
hibernate的缓存分为一级缓存和二级缓存,一级二级和我们常说的cpu的一级二级是不一样的。
这里的一级说的是session的缓存,是hibernate内置的,不能卸载。
二级缓存可以配置和更改,并且动态加载和卸载。Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。
什么样的数据适合存放到第二级缓存中?
- 很少被修改的数据
- 不是很重要的数据,允许出现偶尔并发的数据
- 不会被并发访问的数据
- 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。
不适合存放到第二级缓存的数据?
- 经常被修改的数据 、
- 财务数据,绝对不允许出现并发
- 与其他应用共享的数据。
扩展:流数据:strom 运算
那么其生命周期
hibernate 并没有实现二级缓存,但是是借助插件来实现的,现在市面上的缓存插件已经很多了。
我们使用ehcache来实现。
首先在hibernate中得设置:
<session-factory>
<!--
首先 第一步 :我们使用 这个二级缓存的供应商
-->
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!--
开启二级缓存
-->
<property name="cache.use_second_level_cache">true</property>
<!--
注释掉了 知道有这种方式就行
<class-cache usage="read-only" class=""/>
-->
<!--
根据持久化类生成表的策略
validate 通过映射文件检查持久化类与表的匹配
update 每次hibernate启动的时候,检查表是否存在,如果不存在,则创建,如果存在,则什么都不做了
create 每一次hibernate启动的时候,根据持久化类和映射文件生成表
create-drop
-->
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<property name="current_session_context_class">thread</property>
<property name="format_sql">true</property>
<!--
开启二级缓存的统计机制
-->
<property name="generate_statistics">true</property>
<mapping resource="com/itheima12/hibernate/domain/Classes.hbm.xml" />
<mapping resource="com/itheima12/hibernate/domain/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>