您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Hibernate缓存
1、Hibernate缓存管理Hibernate是一个持久层框架,经常访问物理数据库。为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。Hibernate中提供了两级Cache(高速缓冲存储器),第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或集群范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。事务范围,每个事务都有单独的第一级缓存进程范围或集群范围,缓存被同一个进程或集群范围内的所有事务共享并发访问策略由于每个事务都拥有单独的第一级缓存,不会出现并发问题,无需提供并发访问策略由于多个事务会同时访问第二级缓存中相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别数据过期策略没有提供数据过期策。
2、略。处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象必须提供数据过期策略,如基于内存的缓存中的对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间。物理存储介质内存和硬盘:对象的散装数据首先存放在基于内存的缓存中,当内存中对象的数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。缓存的软件实现:在Hibernate的Session的实现中包含了缓存的实现由第三方提供,Hibernate仅提供了缓存适配器(CacheProvider)。用于把特定的缓存插件集成到Hibernate中。启用缓存的方式只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作,Hibernate就会启用第一级缓存,把数据库中的数据以对象的形式拷贝到缓存中,对于批量更新和批量删除操作,如果不希望启用第一级缓存,可以绕过HibernateAPI,直接通过JDBCAPI来执行指操作。用户可以在单个类或类的单个集合的粒度上配置第二级缓存。如果类的实例被经常读但很少被修改,就可以考虑使用第二级缓存。只有为某个类或集合。
3、配置了第二级缓存,Hibernate在运行时才会把它的实例加入到第二级缓存中。用户管理缓存的方式第一级缓存的物理介质为内存,由于内存容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目。Session的evit()方法可以显式清空缓存中特定对象,但这种方法不值得推荐。第二级缓存的物理介质可以是内存和硬盘,因此第二级缓存可以存放大量的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面:选择需要使用第二级缓存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。一级缓存当应用程序调用Session的save()、update()、saveOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。Session为应用程序提供了两个管理缓存的方法:evict(O。
4、bjectobj):从缓存中清除参数指定的持久化对象。clear():清空缓存中所有持久化对象。Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。一级缓存中,持久化类的每个实例都具有唯一的OID。一级缓存的管理:evit(Objectobj)将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象。clear()将一级缓存中的所有持久化对象清除,释放其占用的内存资源。contains(Objectobj)判断指定的对象是否存在于一级缓存中。flush()刷新一级缓存区的内容,使之与数据库数据保持同步。一级缓存应用演示:当session对象调用save()方法保存一个对象后,该对象会被放入到session的缓存中。get()和load()。当session对象调用get()或load()方法从数据库取出一个对象后,该对象也会被放入到session的缓存中。使用HQL和QBC等从数据库中查询数据。publicclassClient{publicst。
5、aticvoidmain(String[]args){Sessionsession=HibernateUtil.getSessionFactory().openSession();Transactiontx=null;try{/*开启一个事务*/tx=session.beginTransaction();/*从数据库中获取id=402881e534fa5a440134fa5a45340002的Customer对象*/Customercustomer1=(Customer)session.get(Customer.class,402881e534fa5a440134fa5a45340002);System.out.println(customer.getUsernameis+customer1.getUsername());/*事务提交*/tx.commit();System.out.println(-------------------------------------);/*开启一个新事务*/tx=session.beginTransaction();/*从数据库中获取id=402。
6、881e534fa5a440134fa5a45340002的Customer对象*/Customercustomer2=(Customer)session.get(Customer.class,402881e534fa5a440134fa5a45340002);System.out.println(customer2.getUsernameis+customer2.getUsername());/*事务提交*/tx.commit();System.out.println(-------------------------------------);/*比较两个get()方法获取的对象是否是同一个对象*/System.out.println(customer1==customer2resultis+(customer1==customer2));}catch(Exceptione){if(tx!=null){tx.rollback();}}finally{session.close();}}}二级缓存3.1.Hibernate的二级缓存策略的一般过程如下:1)条件查询的时候,总是发出一条。
7、select*fromtable_namewhere….(选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。2)把获得的所有数据对象根据ID放入到第二级缓存中。3)当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。4)删除、更新、增加数据的时候,同时更新缓存。Hibernate的二级缓存策略:是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的查询缓存QueryCache。evict(Classarg0,Serializablearg1)将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源。sessionFactory.evict(Customer.class,newInteger(1));evict(Classarg0)将指定类的所有持久化对象从二级缓存中清除,释放其占用的内存资源。sessionFactory.evict(Customer.class);evictCollectio。
8、n(Stringarg0)将指定类的所有持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源。sessionFactory.evictCollection(Customer.orders);3.2.什么样的数据适合存放到第二级缓存中?1很少被修改的数据2不是很重要的数据,允许出现偶尔并发的数据3不会被并发访问的数据4参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。3.3.不适合存放到第二级缓存的数据?1经常被修改的数据2财务数据,绝对不允许出现并发3与其他应用共享的数据。3.4.常用的缓存插件Hibernater的二级缓存是一个插件,下面是几种常用的缓存插件:lEhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。lOSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。lSwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。lJB。
9、ossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。上述4种缓存插件的对比情况列于表1中。表1种缓存插件的对比情况缓存插件支持只读支持非严格读写支持读写支持事务EhCache是是是OSCache是是是SwarmCache是是JBossCache是是它们的提供器列于表2中。表2缓存策略的提供器缓存插件提供器(CacheProviders)Hashtable(只能测试时使用)org.hibernate.cache.HashtableCacheProviderEhCacheorg.hibernate.cache.EhCacheProviderOSCacheorg.hibernate.cache.OSCacheProvider在默认情况下,Hibernate使用EhCache进行JVM级别的缓存。用户可以通过设置Hibernate配置文件中的hibernate.cache.provider_class的属性,指定其他的缓存策略,该缓存策略必须实现org.hibernate.cache.CacheProvider接口。例如使用EhCache。
10、:!--EHCache的配置,hibernate.cfg.xml--hibernate-configurationsession-factory!--设置二级缓存插件EHCache的Provider类--propertyname=hibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider/property!--启动查询缓存--propertyname=hibernate.cache.use_query_cachetrue/property/session-factory/hibernate-configuration3.5.配置二级缓存的主要步骤:1)选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。2)选择合适的缓存插件,然后编辑该插件的配置文件。例如一下是EHCache插件的配置:!--ehcache.xml--?xmlversion=1.0encoding=UTF-8?ehcache!--缓存到硬盘的路径--d。
本文标题:Hibernate缓存
链接地址:https://www.777doc.com/doc-2876304 .html