框架 day34 Hibernate,h对事务并发处理,管理session,二级缓存,h练习案例

hibernate 对事务并发处理


       事务四个特性 ACID : 原子性、一致性、隔离性、持久性

 

1、隔离性引发问题

脏读、不可重复读、虚读 、丢失更新 (lost update)

       *脏读 :一个事务 读取 另一个事务 未提交的数据

       *不可重复读: 一个事务中连续读取 两次, 第二次读取另一个事务 已经提交 update修改数据 (数据改变)

       *虚读 :一个事务 读取 另一个事务 已经提交 插入数据 (insert记录条数改变)

 

* 丢失更新: 两个事务同时修改数据,后提交事务覆盖了先提交事务的结果

 

2、数据库为了解决事务的隔离性问题,提供四种隔离级别

(不是所有数据库都支持这四种级别)

       *READ_UNCOMMITED : 读取未提交,引发所有隔离问题

       *READ_COMMITTED : 读已提交,阻止脏读,发生不可重复读和虚读

       *REPEATABLE_READ : 重复读 ,阻止脏读、不可重复读,发生虚读

       *SERIALIZABLE : 串行处理,不允许两个事务 同时操作一个目标数据,根本不存在并发,不存在并发问题  (效率低下)

 

** 企业开发中主要 READ_COMMITTED (Oracle默认级别)、REPEATABLE_READ(MySQL默认级别)

 

设置hibernate事务隔离级别

hibernate.connection.isolation = 4

1—Read uncommitted isolation

2—Read committed isolation

4—Repeatable read isolation

8—Serializable isolation

       例如 :

       <!--使用 readcommitted 级别 -->

       <propertyname="hibernate.connection.isolation">2</property>

 

3、丢失更新如何解决

       悲观锁 乐观锁

悲观锁: 采用数据库内部锁机制,在一个事务操作数据时,为数据加锁,另一个事务无法操作

       *排它锁 (写锁),数据库中每张表只能添加一个排它锁,排它锁与其他锁互斥

       *在修改数据时,自动添加排它锁

       *在查询数据时 添加排它锁 select * from customers for update;

 

hibernate中使用悲观锁

              Customercustomer = (Customer) session.load(Customer.class, 1,LockMode.UPGRADE); //MySQL

              Customercustomer = (Customer) session.load(Customer.class, 1,LockMode.UPGRADE_NOWAIT);//oracle

 

* 悲观锁解决丢失更新,效率问题, 数据不能同时修改

 

乐观锁 :与数据库锁无关,在数据表中为数据添加 版本字段,每次数据修改都会导致版本号+1

 

hibernate 为Customer表 添加版本字段

       1)在customer类 添加 private Integer version; 版本字段

       2)在Customer.hbm.xml定义版本字段

              <!--定义版本字段 -->

              <!--name是属性名 -->

              <versionname="version"></version>

 

管理Session


1、 hibernate 提供三种管理Session的方式

       *Session 对象的生命周期与本地线程绑定 (与ThreadLocal绑定)

       *Session 对象的生命周期与 JTA 事务绑定 (分布式事务管理)

       *Hibernate 委托程序管理 Session对象的生命周期

              会在程序中获得Session对象,使用Session, 需要手动session.close()

 

在hibernate配置文件中 配置 hibernate.current_session_context_class 值 thread (使Session与线程绑定)

 

2、示例步骤

       1) 配置hibernate.cfg.xml

              <!--配置session 与线程绑定 -->

              <propertyname="hibernate.current_session_context_class">thread</property>

       2) 在程序中通过sessionFactory.getCurrentSession() 获得线程绑定Session对象

      

注意: 使用 getCurrentSession 获得与线程绑定Session对象时,在事务关闭时,Session对象也会close


二级缓存



1、缓存优点

将数据库或者硬盘数据 ,保存在内存中,减少数据库查询次数,减少硬盘交互,提高检索效率

2、 hibernate的二级缓存

       hibernate共有两个级别的缓存

       *一级缓存 ,保存Session中, 事务范围的缓存

       *二级缓存 ,保存SessionFactory , 进程范围的缓存

 

SessionFacoty 两部分缓存

       内置 : hbm文件配置, 命名查询SQL语句

       外置 : 二级缓存,必须引入第三方缓存插件 才能使用

 

3、二级缓存内部结构学习


       *1类缓存区域

       *2集合缓存区域

       *3更新时间戳区域

       *4查询缓存区域

 

4、二级缓存并发策略


       transactional: 提供Repeatable Read事务隔离级别 ,缓存支持事务,发生异常的时候,缓存也能够回滚

       read-write: 提供Read Committed事务隔离级别, 更新缓存的时候会锁定缓存中的数据

       nonstrict-read-write: 导致脏读,很少使用

       read-only: 数据不允许修改 ,只能查询

 

*适合放入二级缓存中的数据:

       >很少被修改

       >不是很重要的数据, 允许出现偶尔的并发问题

*不适合放入二级缓存中的数据:

       >经常被修改

       >财务数据, 绝对不允许出现并发问题

       >与其他应用数据共享的数据


* 很少被修改,不是很重要,允许偶尔的并发问题,放入二级缓存 考虑因素 (二级缓存 监控,是 是否采用二级缓存主要参考指标)

 

5、 hibernate 支持二级缓存技术


X为支持

       *  EHCache (主要学习,支持本地缓存,支持分布式缓存,)

       *  OSCache

       *  SwarmCache(集群范围)

       *  JBossCache

 

6、二级缓存的配置

       1) 导入第三方 缓存技术 jar包

              ehcache-1.5.0.jar

              依赖backport-util-concurrent-2.1.jarcommons-logging-1.1.1.jar

       2) 在hibernate.cfg.xml 开启二级缓存

hibernate.cache.use_second_level_cache  =  true

              <property name="hibernate.cache.use_second_level_cache">true</property>

       3) 配置二级缓存技术提供商

hibernate.cache.provider_class =  org.hibernate.cache.EhCacheProvider

              <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

       4) 配置缓存数据对象并发策略

              使用read-write 并发策略

              方式一 在*.hbm.xml文件配置(局部配置)

<classname="cn.itcast.domain.Customer" table="customers"catalog="hibernate3day4" >
	<!--类级别缓存 -->
	<cacheusage="read-write"/>
	<set name="orders" cascade="all-delete-orphan"inverse="true" >
		<!--关联集合级别缓存-->
		<cache usage="read-write"/>
	</set>
</class>

              方式二 在hibernate.cfg.xml文件配置 (全局配置)


<!--类级别缓存 -->
<class-cache usage="read-write" class="cn.itcast.domain.Customer"/>
<class-cache usage="read-write" class="cn.itcast.domain.Order"/>
<!--集合缓存 -->
<collection-cache usage="read-write"collection="cn.itcast.domain.Customer.orders"/>

       5) 在src中 配置 ehcache.xml

              将 ehcache-1.5.0jar包中ehcache-failsafe.xml 改名 ehcache.xml 放入 src

      

编写程序: 测试二级缓存的存在

 

7、理解类缓存区 数据存储特点

       *从二级缓存区 返回数据每次 地址都是不同的 (散装数据

       每次查询二级缓存,都是将散装数据 构造为一个新的对象

** get 、 load 方法都可以 读取二级缓存的数据, Query 的 list方法只能存,不能取(需查询缓存)

 

8、理解集合缓存区 数据存储特点

       注释掉 <class-cache usage="read-write"class="cn.itcast.domain.Order"/> Order 类缓存

       orders集合无法缓存

       *集合缓存区(只存放OID) 数据缓存依赖 类缓存区 数据缓存

  ** 一级缓存的操作会同步到二级缓存

 

9、当内存缓存数据过多之后,需要将数据缓存到硬盘上

       配置 src/ehcache.xml

              *<diskStore path="java.io.tmpdir"/> 配置二级缓存硬盘临时目录位置

              *<defaultCache  <!-- 缓存属性配置  -->

 

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <diskStore path="java.io.tmpdir"/>

    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
            />
</ehcache>
↑defaultCache ,是默认配置,该属性 对所有缓存数据 都有效


↓<cache name="com.itcast...Customer"...../>  给指定的对象进行配置

<cache name="cn.itcast.domain.Customer"  // 自定义配置,该属性对cn.itcast.domain.Customer类缓存有效
maxElementsInMemory="10000"  // 内存中最大对象数量,超过数量,数据会被缓存到硬盘
eternal="false" // 是否缓存为永久性 false 不永久
timeToIdleSeconds="120" // 闲置时间,超过时间回收
timeToLiveSeconds="120"  // 存活时间,对象不管是否使用,到了时间回收
overflowToDisk="true" // 是否可以缓存到硬盘
maxElementsOnDisk="10000000" // 硬盘缓存最大对象数量
diskPersistent="false" // 当jvm结束时是否持久化对象 true false 默认是false
diskExpiryThreadIntervalSeconds="120"  // 指定专门用于清除过期对象的监听线程的轮询时间
memoryStoreEvictionPolicy="LRU"//当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略
/>
其他移除策略

LRU:Least Recently Used  最近最少使用
FIFO:First In First Out先进先出
LFU:Less Frequently Used最不常使用

      

10 、更新时间戳区域的作用

       作用:记录数据最后更新时间,确保缓存数据是有效的

更新时间戳,记录数据最后更新时间,在使用二级缓存时,比较缓存时间t1 与 更新时间 t2 , 如果 t2 > t1 丢弃原来缓存数据,重新查询数据库

 

session.createQuery("update Customerset name ='kitty' where id = 1").executeUpdate();

 

11、查询缓存

       有人称查询缓存 为hibernate 第三级缓存


Query 进行查询结果存放到二级缓存,但不从二级缓存获取。

* 二级缓存缓存数据 都是类对象数据 ,数据都是缓存在 "类缓存区域"

       二级缓存缓存PO类对象,条件(key)是id

 

如果查询条件不是id查询, 缓存数据不是PO类完整对象=====> 不适合使用二级缓存

 

查询缓存: 缓存查询数据结果, key是查询生成SQL语句 , 查询缓存比二级缓存功能更加强大

 

配置查询缓存步骤

       1、 配置二级缓存

       2、 启用查询缓存 hibernate.cfg.xml

              <propertyname="hibernate.cache.use_query_cache">true</property>

       3、 必须在程序中指定使用查询缓存

              query.setCacheable(true);

 


12、监测性能

必须开启:hibernate.generate_statisticstrue

		<!-- 二级缓存监测 -->
		<property name="hibernate.generate_statistics">true</property>

通过工厂factory.getStatistics();获得监控的统计信息

       命中:" +statistics.getSecondLevelCacheHitCount());

      丢失:" + statistics.getSecondLevelCacheMissCount());




hibernate练习


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值