Hibernate缓存、对象状态教学内容理解Hibrnate的缓存机制理解对象的状态Hibernate的缓存Hibernate的缓存分为:一级缓存,单个会话的对象缓存。二级缓存,可插拔的缓存插件理解Session缓存当Session加载或保存一个对象时,如果Session的缓存中不存在相应的对象,hibernate就会把该对象加入到一级缓存中。当再次通过Session加载相同OID的对象时,Hibernate将直接从Session的缓存中获取。当Session关闭时,缓存将被清空。//第一次加载时将产生SQL访问数据库Customercusa=(Customer)session.get(Customer.class,1l);//第二次加载同样的Customer时Hibernate将从Session中获取Customercusb=(Customer)session.get(Customer.class,1l);//cusa和cusb应当是同一对象If(cusa==cusb)System.out.println(“同一个对象!”);//缓存被清空session.close();Session缓存的作用减少访问数据库的频率。应用程序从内存中获取对象明显快于从数据库中查找。保证缓存中的对象与数据库相关的记录同步。当处于缓存中的对象的属性发生改变时,Session不会立即更新数据库,它可以将多次更新合并处理后产生一条更新语句。Customercustomer=(Customer)session.get(Customer.class,1);customer.setName(jack);customer.setName(mike);session.update(customer);//以上只会产生一条sql语句。updateCustomersetname='mike'...同步Session缓存Hibernate会在特定的时间自动同步缓存与数据库当人为提交事务时,commit()方法先清理缓存,然后再向数据库提交事务。当执行session的查询方法时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。当执行session.flush时注意:关闭Session时,Hibernate不会执行缓存同步。evict(Objecto):从缓存中清除指定的对象clear():清空缓存中的所有对象管理一级缓存Hibernate二级缓存二级缓存是一个可以插拔的缓存插件,它由SessionFactory负责管理,由于SessionFactory对象的生命周期和应用程序的生命周期对应,因此二级缓存是进程范围或群集范围的缓存。缓存中存放的是对象的散装数据而不是对对象的引用。可以被一个SessionFactory的所有sesison共享二级缓存是可选的,可以在每个类或每个集合的粒度上配置二级缓存。Hibernate二级缓存的执行机制应用程序一级缓存(事务范围内的Session缓存)二级缓存(进程范围或群集范围的缓存)数据库写读写读如果在事务范围的缓存(第1级缓存)中没有查询到相应的数据,还可以到进程范围或群集范围的缓存(第2级缓存)内查询,如果在进程范围或群集范围的缓存内也没有找到该数据,那么就只好查询数据库。写读二级缓存是可配置的插件,Hibernate允许选用以下类型的缓存插件EHCacheOSCacheSwarmCacheJBossCache这些插件都是由第三方提供的。Hibernate2以前提倡用EHCacheHibernate3后提倡用OSCacheHibernate二级缓存的第三方实现使用OSCache配置二级缓存把oscache-2.1.jar加入到当前应用的classpath中。修改hibernate.cfg.xml文件开启二级缓存。hibernate-configurationsession-factory!--开启二级缓存(默认开启)--propertyname=cache.use_second_level_cachetrue/property!--设置缓存提供者--propertyname=hibernate.cache.provider_classorg.hibernate.cache.OSCacheProvider/property!--设置是否生成二级缓存统计信息--propertyname=generate_statisticstrue/propertymappingresource=com/hejin/entity/User.hbm.xml//session-factory/hibernate-configuration使用OSCache配置二级缓存挎贝oscache.properties文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc下。关于缓存中存放多少数据,Hibernate是不关心的,全部由OSCache来完成。在oscache.properties中,有如下的参数配置:cache.capacity=1000这个数值代表放入缓存的对象数量,这个数量根据用户机器的内存来配置,一般只需要配置这个参数即可。使用OSCache配置二级缓存指定哪些实体类使用缓存。经过第一步缓存是启用了,但是并没有被使用。它不会去自动把所有的实体都进行缓存了,而是需要手动指定哪个实体需要缓存,以及其缓存的策略。这里有两种方式,第一种是修改要使用缓存的实体的映射文件。如在User.hbm.xml中使用cache标签启用。hibernate-mappingclassname=“com.hejin.entity.Usertable=t_user!--配置缓存,必须紧跟在class元素后面--cacheusage=“read-only”/idname=idgeneratorclass=native//idpropertyname=name//class/hibernate-mapping使用OSCache配置二级缓存第二种方式是在hibernate.cfg.xml中使用class-cache标签指定实体类并启用。hibernate-configurationsession-factory!--开启二级缓存--propertyname=cache.use_second_level_cachetrue/property!--设置缓存提供者--propertyname=hibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider/propertymappingresource=com/hejin/entity/User.hbm.xml/!--指定哪些实体需要使用二级缓存--class-cacheclass=com.hejin.entity.Userusage=read-only//session-factory/hibernate-configuration二级缓存策略-usage设定read-only缓存的对象只可以读取。read-write缓存的对象可读写。nonstrict-read-write非严格的读写,适合于并发更新的情况非常小(会出现一定的错误数据,即不同步数据)。transaction事务缓存,可支持事务回滚(OSCache中没有此项功能)。使用EhCache配置二级缓存把ehcache-1.2.3.jar加入到当前应用的classpath中。修改hibernate.cfg.xml文件开启二级缓存。hibernate-configurationsession-factory!--开启二级缓存(默认开启)--propertyname=cache.use_second_level_cachetrue/property!--设置缓存提供者--propertyname=hibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider/property!--设置是否生成二级缓存统计信息--propertyname=generate_statisticstrue/propertymappingresource=com/hejin/entity/User.hbm.xml//session-factory/hibernate-configuration使用EhCache配置二级缓存挎贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc下。内容如下:ehcachediskStorepath=java.io.tmpdir/defaultCachemaxElementsInMemory=10000eternal=falseoverflowToDisk=truetimeToIdleSeconds=120timeToLiveSeconds=120diskPersistent=false//ehcache使用EhCache配置二级缓存指定哪些实体类使用缓存。经过第一步缓存是启用了,但是并没有被使用。它不会去自动把所有的实体都进行缓存了,而是需要手动指定哪个实体需要缓存,以及其缓存的策略。这里有两种方式,第一种是修改要使用缓存的实体的映射文件。如在User.hbm.xml中使用cache标签启用。hibernate-mappingclassname=“com.hejin.entity.Usertable=t_user!--配置缓存,必须紧跟在class元素后面--cacheusage=“read-only”/idname=idgeneratorclass=native//idpropertyname=name//class/hibernate-mapping使用EhCache配置二级缓存第二种方式是在hibernate.cfg.xml中使用class-cache标签指定实体类并启用。hibernate-configurationsession-factory!--开启二级缓存--propertyname=cache.use_second_level_cachetrue/property!--设置缓存提供者--propertyname=hibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider/propertymappingresource=com/hejin/entity/User.hbm.xml/!--指定哪些实体需要使用二级缓存--class-cacheclass=com.hejin.entity.Userusage=read-only//session-factory/hibernate-configuration二级缓存示例//Customer使用读写二级缓存classname=Customertable=customerscacheusage=“read-write”/…/class//执行下面一条时,Hibernate将产生一条SQLCustomercus=(Customer)session.get(Customer.class,1l);//关闭Session的一级缓存清空,但二级缓存中仍保留有cus的数据session.close();…//打开session再次获取Customer