zoukankan      html  css  js  c++  java
  • hibernate的缓存你知道多少

          首先我们要明白什么是缓存,缓存是指临时文件交换区。临时就说明了他不是永久性的。缓存是介于cpu和主存之间的设备。他的读写速度比主存快,比cpu慢。缓存有一个叫命中率的概念。这个也很好理解。Cpu是处理数据和运算数据的地方,数据的读取要不来自内存,要不来自缓存。但是缓存介于主存和内存之间。所以如果cpu能直接从缓存中拿数据。那么他执行的效率一定会提高。如果缓存中没有再去主存中那数据。那么你也就可以知道,命中率=缓存访问的次数/(缓存访问的次数+主存的访问次数)

         所以hibernate引入缓存。你就知道为什么了。就是为了提高效率的。要知道每次对数据的访问都是很消耗资源的,而且数据库是外部的,所以时间执行会慢。试想有些数据你要从数据库里面查询(这个结果很大),查询第一遍。接着又要查询第二遍。如果没有缓存这就意味着你要访问两次数据库。但是查询的结果只有一两条更新,或者压根没有更新。所以如果这时候如果有缓存的话,你可以将第一次结果放在缓存中。那么第二次查询你可以从缓存中取数据,如果没有再去访问数据库,这就大大提高了效率。所以使用缓存这里有四个前提,第一:对数据的精确性不是很高,也就是说你允许有数据误差。第二:修改次数小于读写的次数(缓存命中率要高),试想如果你第一次和第二次的查询,结果根本就不一样,

    首先去缓存找没找到,然后去数据库中找。这样还不如不要缓存直接上数据库找。第三:数据要有独享控制,如果你这边在读写那边这修改这样的数据基本就是废的。第四:数据的容量小于内存容量,这是硬伤,否则会内存溢出、

           那么hibernate的缓存个人认为是变相的map,事实上他也是个map。首先如何实现缓存,用户第一次查询数据,在换回结果的同时也把结果放到map里面一份。要知道map是一个键值对的集合,这里的key就是你的hql语句,value就是你的封装有用的信息。那么第二次查询hql语句相同的情况下,hibernate就会自己先去map里面找,如果没有就去数据库里面找。而且本人对集合的理解就是集合是可以执行增删改查的容器。所以我们对map的移除的过程就是在清理缓存的过程。当然hibernate的缓存远没有一个map这么简单,比如说缓存的有效时间之类的事情要解决。

           hibernate中缓存缓存分为一级缓存和二级缓存。一级缓存是session级的共享,主要这些可以操作有saveupdatesaveOrUpdateloadgetlistiteratelockevickclearcontainsflush但是一级缓存作用范围小,所以hibernate2级缓存。一般hibernate现在1级缓存中找如果找不到就去2级缓存中找。二级缓存,sessionFactory级的共享,首先hibernate在配置文件中要启用2级缓存的配置。

     

    hibernate.cfg.xml 

     

    <hibernate-configuration>

        <session-factory>

           <!-- 设置二级缓存插件EHCache的Provider类-->

           <propertyname="hibernate.cache.provider_class">

              org.hibernate.cache.EhCacheProvider

           </property>

           <!-- 启动"查询缓存" -->

           <propertyname="hibernate.cache.use_query_cache">

              true

           </property>

        </session-factory>

      </hibernate-configuration>

    ehcache.xml 

    <ehcache>

     <!-- maxElementsInMemory为缓存对象的最大数目, eternal设置是否永远不过期,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数 -->

      <diskStorepath="java.io.tmpdir"/>

        <defaultCache maxElementsInMemory="10000"eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"overflowToDisk="true"/>

    </ehcache>

    ****.hbm.xml 

    <?xmlversion="1.0" encoding='UTF-8'?>

    <!DOCTYPE hibernate-mappingPUBLIC

                                "-//Hibernate/HibernateMapping DTD 3.0//EN"

                               "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

    <hibernate-mapping>

        

       <class>

           <!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write nonstrict-read-writetransactional-->

           <cacheusage="read-write"/>   

       </class>

    </hibernate-mapping>

    还有客户实现web上数据的访问的时候有服务器有两种缓存方式,一种是分布缓存和中央缓存的方式。分布式获取数据快但是修改数据的时候成本高,另一种相反,所以视情况而定。

  • 相关阅读:
    SharePoint 2013 开发——开发并部署Provider-hosted APP
    SharePoint 2013 开发——Provider-hosted APP准备工作
    (转)CString工作原理和常见问题分析
    WinDbg调试 C# dmp
    使用fastcall 代替汇编hook thiscall
    Windows Socket 编程_单个服务器对多个客户端简单通讯
    IOCP模型与网络编
    非阻塞模式(ioctlsocket)
    GDT与LDT
    常见程序入口点(OEP)特征
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3262974.html
Copyright © 2011-2022 走看看