1.瞬时状态 Transient
持久化对象没有id,而且没有和session关联
2.持久状态 persistent
持久化对象有id,而且跟session有关联
3.游离状态(托管状态) detached
持久化对象有id,但是跟session没有关联
Hibernate缓存
1.缓存概念
1.缓存就是一块内存区域。介于应用程序和物理数据源(例如:电脑磁盘)之间
2.提高程序的运行速率, 从而提高了用户的体验度。
3.缓存就是目标数据源的一个复本(复制)。应用程序直接访问缓存。一般会在特定时间刷新缓存。
2.Hibernate缓存
持久化层(dao层),对数据(操作的数据库中的数据)的备份
2.1 Hibernate一级缓存(Session级别)
Session级别的缓存:Hibernate内置的,不能卸除。如果session关闭了,缓存就清空了。
适用情况: 一次业务功能操作内有多次操作数据库。只访问一次,后续访问的是缓存数据。
案例1:以查询为例:
结论:
使用session多次查询。只要查询都会将查询的结果存储到缓存区域。那下次再查询直接从缓存中查找,找到就直接获取,没有找到再次发起sql去连接数据库查询
案例: 快照
快照也是一块内存区域。快照是session缓存中一部分。
快照的目的是在提交事务的时候,会比较缓存和快照内容。
2.2Hibernate实现二级缓存的步骤:
1.添加二级缓存的包(下载的库/lib/optional/ehcache/xx.jar(3个)) 2.在主配置文件(hibernate.cfg.xml)配置开启二级缓存 <!--配置开启二级缓存 --> <property name="hibernate.cache.use_second_level_cache">true</property> <!-- 指定使用哪个二级缓存(Hibernate二级缓存有5种实现,Ehcache常用的一种) --> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> 3.配置缓存的配置文件 ehcache.xml(hibernate提供了,开发者只需要根据自己的需求更改缓存目录及内容即可) ehcache.xml该文件的位置:hibernate下载的库/project/etc/ehcache.xml 关键代码如下: <!--配置缓存的磁盘目录(该目录要存在) --> <diskStore path="C:hibernatecache"/> <!-- name:指明要缓存的持久化类:包名+类名 --> <cache name="com.qf.domain.Customer" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" /> 4.在缓存的持久化类映射的地告诉程序缓存的策略 ready-only 默认的,常用的,缓存数据无需修改,只需要读取即可。 read-write 需要修改缓存数据,常用于对缓存进行读和写。数据库隔离级别不能为serializable(可串行化) notstrict-read-write 只是偶尔更新数据。(示例:两个事务同时更新一条数据,非常该策略。) transaction:ehcache不支持。 示例:以下配置映射文件中的class的里面 <!--设置缓存策略 --> <cache usage="read-only"/> 5.验证测试: 二级缓存和一级缓存的关系: 默认使用一级缓存,当一级缓存不存在的情况下,去读取二级缓存。 可以认为:二级缓存是一级缓存的补充。 重要的信息优先在一级缓存存储,不太重要的信息在二级缓存。 二级缓存通常用于什么情况? 不太重要的信息。 很少被修改的数据。 常量数据。 补充:一级缓存Session级别.如何清除一级缓存: 1.evict(Object o) 2.clear() 3.close() 二级缓存SessionFactory级别,如何清除二级缓存: 1.sessionFactory.close() 2.把缓存文件删除(不建议)