《hibernate高级应用.ppt》由会员分享,可在线阅读,更多相关《hibernate高级应用.ppt(27页珍藏版)》请在金锄头文库上搜索。
1、Hibernate高级应用主讲人:杨云振Hibernate事务和并发处理Hibernate缓存策略批量处理延迟加载课程内容什么是事务?单个逻辑工作单元,它包含一系列的操作。事务的特性(ACID)原子性一致性隔离性持久性事务1.1.脏读取脏读取(Dirty Reads)(Dirty Reads)一个事务读取了另一个事务未提交的数据一个事务读取了另一个事务未提交的数据2.2.不可重复读不可重复读(Non-repeatable Reads)(Non-repeatable Reads)一个事务再次读取之前曾读过的数据时,发现该数一个事务再次读取之前曾读过的数据时,发现该数据已经被另一个提交的事务修改据
2、已经被另一个提交的事务修改3.3.虚读虚读( (幻读幻读) )一个事务重新执行一个查询,返回一套符合条件的一个事务重新执行一个查询,返回一套符合条件的记录,但这些记录中包含了因为其他最近提交的事记录,但这些记录中包含了因为其他最近提交的事务而产生的新记录务而产生的新记录数据操作过程引发的问题?1.脏读取(Dirty Reads)时间时间取款事务取款事务支票事务支票事务T1开始事务T2开始事务T3查询帐户余额1000元T4取出100元,把存款余额改成900元T5查询帐户余额900(脏读)T6回滚事务,余额变为1000元T7汇入100元,把余额更改为1000元T8提交事务2.不可重复读时间时间取款
3、事务取款事务支票事务支票事务T1开始事务T2开始事务T3查询帐户余额1000元T4查询帐户余额1000元T5存入100元,把存款余额改成1100元T6存入100元,把存款余额改成1100元T7提交事务T8提交事务虚读(幻读)时间时间注册事务注册事务统计事务统计事务T1开始事务T2开始事务T3查询注册人数为100人T4新注册一个用户T5提交事务T6再次查询,注册人数为101人T7弄不清楚到底是100人还是101人数据库事务管理隔离级别什么是事务的隔离级别?数据库通过某种机制,在多个并行的事务之间进行隔离,使每个事务在执行过程中保存独立.隔离等级隔离等级脏读取脏读取不可重复读不可重复读虚读虚读Re
4、ad Uncommitted可能可能可能Read Committed不可能可能可能Repeatable Read不可能不可能可能Serializable不可能不可能不可能从上到下严密程度递增,性能递减Hibernate是JDBC轻量级的封装,本身不具备事务的管理能力,在事务管理层委托给底层的JDBC或JTA进行事务的管理和调度。1.基于JDBC的事务管理Hibernate事务管理JDBC的事务是有Connection管理的,事务的周期依赖于Connection的生命周期。而Session依托于Connection实现的,事务局限与session的生命周期。提供了跨越session的事务管理能力
5、。基于JTA的事务管理。Hibernate隔离级别的设置在hibernate的配置文中配置隔离级别4隔离级别与它们的代表数字如下隔离级别代表数字Read uncommitted1Read committed2Repeatable read4Serializable8悲观锁(perssimisticlocking)在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制。乐观锁(optimisticlocking)乐观锁并没有对任何操作加锁,它只是在事务更新记录时,对事务进行检查,看从上一次读取这条记录后,它是否被其他事务修改.Hibernate中锁机制悲观锁是解决事务并
6、发的一种方法,悲观锁是在更新数据时把记录锁住,防止其他事务读写这个记录.Hibernate的加锁模式有LockMode.NONE(无锁机制)LockMode.WRITE:当向数据库中插入或更新数据时,Hibernate会自动使用这种锁。LockMode.READ:Hibernate在读取记录时自动获取注:以上三种机制为Hibernate内部对数据的锁定机制,与数据库无关。LockMode.UPGRADE:利用数据库的forupdate子句加锁LockMode.UPGRADE_NOWAIT:Oralce的特定实现,利用oracle的forupdatenowait子句加锁悲观锁机制Hibernat
7、e提供了三种方法来检查数据是否发生了变化。1.使用version实现乐观锁2.使用时间戳实现乐观锁3.对比字段值实现乐观锁其中已使用version的方法最为常用。步骤:1.首先为映射文件(xx.hbm.xml)中的class节点添加optimistic-lock属性2.在Id节点下添加version节点Hibernate中的乐观锁缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。ORM缓存策略1.事务级缓存(sessionlevelcache)session生命周期的缓存,关闭session即消亡2.应用级/进程级缓存(session
8、Factorylevelcache)某个应用中的共享缓存,多个事务可以共享,在sessionFactory层实现,所有sessionFactory创建的session可以共享.3.分布式缓存多个JVM共享的缓存,通过远程机制实现缓存数据同步,任意实例修改数据,所有的JVM都要更新缓存.缓存机制1.内部缓存(sessionlevel)一级缓存是事务级的缓存,session中维护的一个Map,Map的key是包含了数据类型和id,从数据库加载的数据都会进入Map缓存中,通过session加载数据时会先在session缓存里找,一级缓存是session的private数据,session实例消亡就清
9、除了,在应用中就保持在一次请求的开始和结束之间.一般由Hibernate自动维护,也支持手动维护session.evit(Objectobj)将持久化对象从一级缓存中清除.session.clear()清空一级缓存session.contains(Objectobj)判断指定的对象是否存在于一级缓存中.session.flush()刷新一级缓存区的内容,使缓存与数据库数据保持同步.Hibernate缓存(一)2.二级缓存(sessionFactorylevel)包含了应用级和分布式的缓存,由本sessionFactory的所有session实例共享,session操作时会先查一级缓存,然后查二
10、级缓存,最后再查物理数据库.要使用二级缓存必须要进行配置.Hibernate缓存(二)1.不会被其他应用修改包括直接用JDBC修改等,因为其他应用修改了数据之后hibernate并不知道,不能自动更新缓存,不过可以手动更新缓存2.数据大小可以接受,毕竟内存资源也不多3.数据更新频率低(比如数据字典等常量数据)4.可能被系统频繁使用5.非关键的数据6.不会被并发访问的数据适合用缓存的数据EHCacheorg.hibernate.cache.EhCacheProviderOSCacheorg.hibernate.cache.OSCacheProviderSwarmCaheorg.hibernate
11、.cache.SwarmCacheProvider提供了分布式JBossCacheorg.hibernate.cache.TreeCacheProvider提供了分布式常用的二级缓存插件步骤1.首先要在hibernate.cfg.xml配置,启用二级缓存2.然后配置cache的配置文件ehcache.xml3.最后要在映射文件xxx.hbm.xml中指定实体的缓存同步策略Hibernate的二级缓存的配置org.hibernate.cache.EhCacheProvidertrue配置Hibernate.cfg.xmlmaxElementsInMemory为缓存对象的最大数目,eternal设
12、置是否永远不过期,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数,overflowtodisk内存不足时是否启用磁盘缓存配置缓存配置文件(ehcache.xml)配置映射文件xx.hbm.xmlUsageUsage属性表示属性表示: :缓存同步策略缓存同步策略read-only:只读 nonstrict-read-write:更新频率高read-write:严格可读写transactional(Ecache不支持):事务型缓存场景:使用hibernate将100000条记录插入一个数据库中sessionsession=
13、sessionfactory.opensession();Transactiontx=session.beginTransaction();for(inti=0;i100000;i+)Personp=newPerson(.);session.save(p);mit();session.close();批量处理这段程序运行到50000条时,就会内存溢出。 1.清理缓存:只要在session.save(p)之后添加:if(i%20=0)session.flush();/将缓存中的对象同步到数据库session.clear();批量处理的方法(一)2.使用StatelessSession接口:它不和
14、一级缓存,二级缓存交互,也不触发任何时间,监听器,通过该接口的操作会立即发送给数据库。StatelessSessions=sessionFactory.openStatelessSession();该接口的方法与session类似.3.Query.executeUpdate()执行批量更新,会清除相关联的类二级缓存,也可能会造成级联和乐观锁定问题Queryquery=session.createQuery(“updateUserinfousetbirthDay=:bd”).setDate(“bd”,newDate();query.executeUpdate();批量处理的方法(二)延时加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载是当真正需要数据的时候,才真正执行数据加载操作,在hibernate中提供了实体对象的延迟加载以及对集合的延迟加载,另外在hibernate3中还提供了对属性的延迟加载。是通过设置属性lazy=true来实现的。延时加载