广州凡科互联网科技有限公司

营业时间
MON-SAT 9:00-18:00

全国服务热线
18720358503

公司门店地址
广州市海珠区工业大道北67号凤凰创意园

hibernate缓存文件的学习培训,hibernate缓存文件学

日期:2021-02-19 浏览:

hibernate缓存文件的学习培训,hibernate缓存文件学习培训

这篇blog将学习培训hibernate的缓存文件对策,缓存文件是hibernate提升特性的关键方式。
在hibernate中缓存文件关键分成:session的缓存文件,sessionFactory的缓存文件,在其中,sessionFactory缓存文件又分成:内嵌缓存文件和外接缓存文件,有关缓存文件有一下几个方面必须表明:
1.session的缓存文件和sessionFactory的内嵌缓存文件,全是内嵌的,变成hibernate的一级缓存文件。
2.sessionFactory的内嵌缓存文件中包括了投射数据库的预订义sql。
3.sessionFactory的外接缓存文件是一个能够配备的软件。默认设置不是打开的,必须大家手动式配备,外接缓存文件的数据信息是数据信息库数据信息的复制,外接缓存文件的储放地区能够是运行内存或是电脑硬盘。


sessionFactory缓存文件:缓存文件目标种类的数据信息
当session关掉的情况下,sessionFactory中缓存文件的目标将被清除。


UserInfo userInfo = (UserInfo) session.get(UserInfo.class,10);
System.out.println(userInfo.getUserName());
System.out.println(userInfo.getUserName());
System.out.println(userInfo.getUserName());
System.out.println(userInfo.getUserName());
System.out.println(userInfo.getUserName());

目标,随后持续四次获得该目标的username特性,sql句子复印以下:
这里写图片描述
能够发觉仅有hibernate只传出了一条sql查寻句子。
2.load方式检测
假如大家将上边根据get方式获得的实体线类目标,改成load方式来载入,一样的,hibernate会只传出一条查寻句子。
3.list方式检测


UserInfo userInfo = (UserInfo) session.load(UserInfo.class,10); System.out.println(userInfo.getUserName()); UserInfo userInfo2 = (UserInfo) session.load(UserInfo.class,10); System.out.println(userInfo2.getUserName()); System.out.println(userInfo.getUserName()); System.out.println(userInfo.getUserName()); System.out.println(userInfo.getUserName());

这时hibernate一样只传出一条sql句子。
这里写图片描述
能够发觉,最先查寻全部数据信息,随后将其缓存文件到session中,再度查寻的情况下,不用在从数据信息库之中查寻。


session = factory.openSession(); UserInfo userInfo = (UserInfo) session.load(UserInfo.class,10); System.out.println(userInfo.getUserName()); UserInfo userInfo2 = (UserInfo) session.load(UserInfo.class,10); System.out.println(userInfo2.getUserName()); System.out.println(userInfo.getUserName()); System.out.println(userInfo.getUserName()); System.out.println(userInfo.getUserName());

这儿我仅仅在查寻进行全部数据信息之后,提升了一条关掉session的句子。这时当再度load方式查寻的情况下,又会再次传出一条sql句子。这充足表明查寻出的数据信息是缓存文件到session之中的。
这里写图片描述

session不可以从缓存文件中取数据信息
List UserInfo lists = session.createQuery(hql).list(); for (UserInfo userInfo : lists) { System.out.println(userInfo.getUserName()); List UserInfo lists2 = session.createQuery(hql).list(); for (UserInfo userInfo : lists2) { System.out.println(userInfo.getUserName()); }

这儿我2次根据list方式查寻数据信息。hibernate传出的sql以下:
这里写图片描述
能看出。list只有给缓存文件中储放数据信息,可是再度查寻的情况下還是会传出sql查寻全部的句子。


刚刚讲过,list是只有给缓存文件中储放数据信息,可是却不可以从缓存文件之中取数据信息。iterator是能够的,那麼iterator是如何保证的呢??看看面的编码:


String hql = "from UserInfo";
Iterator UserInfo itertor = session.createQuery(hql).iterate();
while (itertor.hasNext()) {
 System.out.println(itertor.next().getUserName());
Iterator UserInfo itertor2 = session.createQuery(hql).iterate();
while (itertor2.hasNext()) {
 System.out.println(itertor2.next().getUserName());
}

这儿2次根据iterator查寻全部的数据信息,这时hibernate传出的sql句子以下图:
这里写图片描述


大家如今早已了解了,list是能够给缓存文件之中储放数据信息的,但是不能以从缓存文件之中取数据信息,list查寻只传出一条sql查寻全部的句子就可以,而iterator是能够从缓存文件之中载入数据信息的,假如应用iterator查寻全部数据信息,会最先查寻全部的id,随后依据id一次传出sql句子,查寻每一条纪录,那样无形中之中就减少了查寻高效率,那麼大家能够依据这种特点,将list查寻和iterator查寻融合起來应用。
大家能够最先应用list查寻全部,那样总是传出一条查寻句子,无须想iterator那般传出n+1条sql句子,提高了查寻高效率,第一其次后查寻全部数据信息的情况下,便可以立即应用iterator来查寻,那样能够只查寻全部的id,随后依据id从缓存文件之中取数据信息,编码以下:


String hql = "from UserInfo";
List UserInfo lists = session.createQuery(hql).list();
for (UserInfo userInfo : lists) {
 System.out.println(userInfo.getUserName());
Iterator UserInfo itertor = session.createQuery(hql).iterate();
while (itertor.hasNext()) {
 System.out.println(itertor.next().getUserName());
}

这时hibernate传出的sql与我们预估的一样:
这里写图片描述


在hibernate中,二级缓存文件默认设置是开启的,一般来说,hibernate的二级缓存文件是和运用的性命周期时间是一样的,因为二级缓存文件的数据信息每个session都可以以开展浏览和变更,因此假如出現分布式系统的情况下,有将会会出現难题。
1.加上ecache需要的jar文档:
在hibernate-release-4.3.10.Final\lib\optional\ehcache文件目录下有那样三个jar文档,必须添加到工程项目中:
slf4j-api-1.6.1.jar
hibernate-ehcache-4.3.10.Final.jar
ehcache-core-2.4.3.jar
2.配备二级缓存文件:
在hibernate.cfg.xml文档中开展配备:

 !-- 配备缓存文件出示类 -- 
 property name="cache.provider_class" 
 org.hibernate.cache.EhCacheProvider
 /property 
 !-- 开启查寻缓存文件 -- 
 property name="cache.use_query_cache" true /property 

说白了查寻缓存文件便是让hibernate缓存文件list,iterator,createQuery等方式的查寻結果集,假如沒有开启查寻缓存文件,hibernate将只缓存文件load方式得到的单独长久化目标。
留意:在开启查寻缓存文件 以后,启用query.list()以前,务必显示信息启用query.setCacheable(true)来标志该查寻应用缓存文件。
3.创建ehcache.xml,在类相对路径下:

 ?xml version="1.0" encoding="UTF-8"? 
 ehcache 
 diskStore path="java.io.tmpdir"/ 
 defaultCache
 maxElementsInMemory="10000"
 eternal="false"
 timeToIdleSeconds="120"
 timeToLiveSeconds="120"
 overflowToDisk="true"
 maxElementsOnDisk=""
 diskPersistent="false"
 diskExpiryThreadIntervalSeconds="120"
 memoryStoreEvictionPolicy="LRU"
 /ehcache 

表明一下:
diskStore表明设定cache文档的储放文件目录,有以下三种配备:
1.user.home 表明客户的主文件目录
2.user.home 表明客户当今的工作中文件目录
3.java.io.tmpdir 默认设置的temp文档文件目录
maxElementsInMemory :以内存中较大的目标缓存文件总数
eternal :设定是不是为永久性缓存文件,假如是永久性缓存文件,则timeout将被忽视。
可选择的特性:
timeToIdleSeconds:表明设定原素到期前的空余時间
timeToLiveSeconds:表明设定原素到期前的主题活动時间
diskPersistent:表明是不是disk store在虚似机起动时长久化。默认设置为false
diskExpiryThreadIntervalSeconds:表明运作disk结束进程的時间,默认设置为120秒
memoryStoreEvictionPolicy:表明对策有关Eviction
4.配备投射文档
在必须被缓存文件的类相匹配的投射文档中配备hibernate的缓存文件对策


这儿我配备的缓存文件对策是可读写能力的。该配备有以下一些值:
1.read-only :表明不用改动的数据信息。
2.read-write :必须升级数据信息
3.nonstrict-read-write 非严苛读写能力缓存文件对策。只必须有时候升级数据信息,而且都不必须十分严苛的事情防护。
5.撰写检测编码:


for ( : list) { System.out..getUid()+"---"+.getUname()); session.close(); Session session2 = sf.openSession(); =(UserInfo)session2.get(UserInfo.class, 1); System.out..getUid()+"***"+.getUname());

这儿,尽管第一次查寻进行后session就早已关掉,可是因为配备了二级缓存文件,因此当session2再度查寻的情况下,不是必须再传出sql句子从数据信息库之中查寻的。

有关hibernate的缓存文件的学习培训就到这儿了。

dengb.TechArticlehibernate缓存文件的学习培训,hibernate缓存文件学习培训 这篇blog将学习培训hibernate的缓存文件对策,缓存文件是hibernate提升特性的关键方式。 在hibernate中缓存文件关键分成:...



网站知识

联系方式丨CONTACT

  • 全国热线:18720358503
  • 传真热线:18720358503
  • Q Q咨询:2639601583
  • 企业邮箱:2639601583@qq.com

首页
电话
短信
联系