2 qq 27548721 qq_27548721 于 2016.04.29 14:26 提问

Hibernate的二级缓存问题 1C

1.hibernate.cfg.xml配置如下

<!-- 设置二级缓存供应商 -->
    <property name="cache.provider_class">
        org.hibernate.cache.EhCacheProvider
    </property>
    <!-- 开启二级缓存 -->
    <property name="cache.use_second_level_cache">
        true
    </property>
    <!-- 开启二级缓存统计机制 -->
    <property name="generate_statistics">
        true
    </property>

2 .Privilege的hbm.xml配置如下

    <hibernate-mapping>
<class name="com.back.domain.privilege.Privilege" table="PRIVILEGE">
<cache usage="read-only"/>
    <id name="id" type="java.lang.Integer">
        <column name="ID" />
        <generator class="increment" />
    </id>
    <property name="role" type="java.lang.String">
        <column name="ROLE" />
    </property>
    <set name="uers" table="user_privilege" cascade="save-update">
        <key>
            <column name="PID" />
        </key>
        <many-to-many class="com.back.domain.user.User" column="UID" />
    </set>
</class>
</hibernate-mapping>

3.使用二级缓存

    SessionFactory sessionFactory=SessionFactoryUtils.getSesessionFactory();
    Session session=sessionFactory.openSession();
    Query query=session.createQuery("from com.back.domain.privilege.Privilege");
    List<Privilege> list=query.list();
    for(Privilege user:list){
        System.out.println(user.getRole());
    }
    System.out.println("二级缓存有:"+sessionFactory.getStatistics().getEntityLoadCount());
    session.close();
    System.out.println("--------------------");
    System.out.println("二级缓存有:"+sessionFactory.getStatistics().getEntityLoadCount());
    Session session2=sessionFactory.openSession();
    Query query2=session2.createQuery("from com.back.domain.privilege.Privilege where id=1");
    Iterator<Privilege> iterator=query2.iterate();
    while(iterator.hasNext()){
        System.out.println(iterator.next().getRole());
    }
    System.out.println("二级缓存有:"+sessionFactory.getStatistics().getEntityLoadCount());
    session2.close();
}
  1. 问题? 二级缓存已经有了值,为什么还是从数据库中又去获取了,我换成其他类都没这个问题,唯独这个Privilege有这个问题。而且本来Privilege表有4条记录,也就是二级缓存一开始有4个对象,但是经过迭代获取后,二级缓存有8个对象?

2个回答

yonghuwangwei
yonghuwangwei   2016.05.08 14:31

测试了很久,都有使用二级缓存,不过我用的自己的项目,如果可以的话,把项目打包过来看看。

CSDNXIAOC
CSDNXIAOC   2016.04.29 14:32

在加入ehcache.xml配置文件时所产生的编译错误异常!
   net.sf.ehcache.CacheException: Error configuring from file:/F:/Struts2/Hibernate21/bin/ehcache.xml. Initial cause was Error configuring from input stream. Initial ca......
答案就在这里:Hibernate二级缓存问题
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Hibernate 一级缓存 二级缓存 1+N问题 查询缓存
在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别)、二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题。 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解。 一、N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: li
这是我看过最好的对hibernate的二级缓存解析
很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了。  我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1是一样的,请原谅我的顽固不化。 hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级
Hibernate中配置二级缓存的并发策略
Hibernate应用中,设置二级缓存的并发策略有两种方法,一种是通过Hibernate的全局配置文件,另一种是为各个Entity类单独设置。 1. 通过hibernate.cache.default_cache_concurrency_strategy配置参数,设置全局的二级缓存的并发策略 hibernate.cache.default_cache_concurrency_strateg
Hibernate二级缓存问题
相关概念和定义 1、缓存的意义 把一些不常修改,但是又经常用的数据存放到内存中,这样能减少与数据库的交互,提升程序的性能 2、Hibernate中提供了两级缓存: 第一级别的缓存是Session级别的缓存(比如说在调用get方法的时候,如果已经查询过一次了,第二次就不会查了,而是直接返回session缓存中已经存在的那个对象给你,不过这个只对当前Session有效,一旦又开一个新的Sess
hibernate二级缓存与查询缓存之间的关系
我们先看一下什么样的hibernate操作会将数据存入到一级缓存中去,当调用下边这些方法的时候会将数据存入到一级缓存中 一级缓存 save、update、saveOrupdate、load、list、iterate、lock,例如: User userOne=new User(); user.setName("名字"); //放入一级缓存 s.save(user); //查
Hibernate之Hibernate+EHCache配置二级缓存实战
准备条件: 我使用的版本是:hibernate-release-4.2.2.Final Hibernate必须的jar包:hibernate-4.2.2\hibernate-release-4.2.2.Final\lib\required下的所有包 数据库驱动jar包:我用的mysql库,mysql-connector-java-5.1.21.jar EHCache相关jar包:hib
spring4-hibernate4-二级缓存ehcache配置
一、 Ehcache配置文件ehcache.xml xml version="1.0" encoding="UTF-8"?> ehcache name="es">       diskStore path="java.io.tmpdir"/>       defaultCache         maxElementsInMemory="10000"  eterna
详解Hibernate中的二级缓存
1.前言 这篇博客再前几篇博客的基础上来讲解一下,Hibernate中的二级缓存,二级缓存是属于SessionFactory级别的缓存机制。第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预。第二级别的缓存是SessionFactory级别的缓存,是属于进程范围的缓存。  2.Hibernate二级缓存 1.分类
Hibernate二级缓存
Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存
使用 Hibernate 二级缓存的步骤
1. 使用 Hibernate 二级缓存的步骤: 1). 加入二级缓存插件的 jar 包及配置文件: I. 复制 \hibernate-release-4.2.4.Final\lib\optional\ehcache\*.jar 到当前 Hibrenate 应用的类路径下. II. 复制 hibernate-release-4.2.4.Final\project\etc\eh