zoukankan      html  css  js  c++  java
  • Hibernate的缓存(收集)

    (1)缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象 时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。

    2)Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象 时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于Session代 表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关 闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因 此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种 全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。


    (3)二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。 在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己 的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起 Hibernate的二级缓存。扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当 使用Hibernate 的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。

    *********实现OSCache二级缓存的配置方案***********

    1.首先我们需要在hibernate.cfg.xml中配置几个属性:

    <!-- 是否开启二级缓存,缺省为开启 -->
    <property name="cache.use_second_level_cache">true</property>
    <!-- 选择第三方缓存框架支持 -->
    <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>

    为了能够查看二级缓存的使用效果,还可以配置:

    <property name="generate_statistics">true</property>


    2.然后是哪些类需要配置二级缓存:(举例User实体类)

    <class-cache class="com.sy.vo.User" usage="read-write" />


    其中usage是策略,属性值:

    read-only:只读,效率最高。
    read-write:读写,效率较低。但是能保证并发正确性。
    nonstrict-read-write:非严格的读写,效率较高,不用加锁,不能保证并发正确性。例如帖子浏览量。
    transactional:事务性缓存,可回滚缓存数据,一般缓存框架不带有此功能,实现很复杂。

    这样hibernate.cfg.xml就配置完了。

    3.配置映射文件User.hbm.xml,加入这句代码:

    <cache usage="read-write"/>

    4.加入oscache.properties配置文件到classPath下,这个文件在hibernate源码包中有。里面
    有很多属性可以设置,如果只是简单实现,不需要修改。不修改的情况下,只有一个配置,是
    配置二级缓存的大小,这个视本机内存而定。默认1000。
    其中还有一个分布式的配置,可以设置主机IP等等。由于资源有限,我没有做实验。在此不做过多介绍。

    OK,配置完成!

    ----------------------------------------------------------------------------------------------------------

  • 相关阅读:
    Parameter Binding in ASP.NET Web API
    Which HTTP methods match up to which CRUD methods?
    ErrorHandling in asp.net web api
    HttpStatusCode
    Autofac Getting Started(默认的构造函数注入)
    Autofac Controlling Scope and Lifetime
    luvit 被忽视的lua 高性能框架(仿nodejs)
    undefined与null的区别
    VsCode中使用Emmet神器快速编写HTML代码
    字符串匹配---KMP算法
  • 原文地址:https://www.cnblogs.com/nickhan/p/4593107.html
Copyright © 2011-2022 走看看