spring-Hibernate 二级缓存问题

问题描述

Hibernate 二级缓存问题

框架是spring+hibernate,配置了二级缓存;
第一种方法二级缓存生效:直接调用session。
第二种方法二级缓存无效:使用hibernateTemplate。
方法1:(调用两次以下方法,第二次没有打印sql)

        s = sessionFactory.openSession();
        tx = s.beginTransaction();
        log.info("1 try to load application dsg.");
        ApplicationDSG adsg = (ApplicationDSG) s.get(ApplicationDSG.class, appDSGId);
        log.info(" --application dsg:" + adsg.toString());

方法2:使用hibernateTemplate

    hibernateTemplate.setCacheQueries(true);
    ApplicationDSG adsg1 = hibernateTemplate.get(ApplicationDSG.class, appDSGId);
    Application a1 = adsg1.getApplication();
    a1.getApplicationName();
    ApplicationDSG adsg2 = hibernateTemplate.get(ApplicationDSG.class, appDSGId);
    Application a2 = adsg2.getApplication();
    a2.getApplicationName(); 

    System.out.println(hibernateTemplate.getQueryCacheRegion()); 

    Statistics statistics = sessionFactory.getStatistics();
    System.out.println(statistics);
    System.out.println("放入" + statistics.getSecondLevelCachePutCount());
    System.out.println("命中" + statistics.getSecondLevelCacheHitCount());
    System.out.println("错过" + statistics.getSecondLevelCacheMissCount());

hibernateTemplate 在xml中生成:

 <!-- hibernate template -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="cacheQueries">
        <value>${hibernate.template.cacheQueries}</value>
    </property>
</bean>

 方法1,2中的sessionFactory是一个。 问题不在这方面。

有没有知道这个是什么原因的?希望给与解答。

解决方案

相关概念和定义
1、缓存的意义
把一些不常修改,但是又经常用的数据存放到内存中,这样能减少与数据库的交互,提升程序的性能
2、Hibernate中提供了两级缓存:
第一级别的缓存是Session级别的缓存(比如说在调用get方法的时候,如果已经查询过一次了,第二次就不会查了,而是直接返回session缓存中已经存在的那个对象给你,不过这个只对当前Session有效,一旦又开一个新的Se......
答案就在这里:Hibernate二级缓存问题
----------------------

解决方案二:

sessionFactory俗称session工厂,如果你的项目只使用了一个数据库,那么这个项目从头至尾都是这一个工厂,sessionFactory的实例化是通过反射来读取配置文件,并且只实例化一次

解决方案三:

通过看源码,Spring在创建new session时,有几个函数,注明二级缓存无效。估计是这个原因。但是why?还不知道

解决方案四:

参见:SessionFactoryUtils

时间: 2024-08-31 04:51:46

spring-Hibernate 二级缓存问题的相关文章

如果项目已有spring缓存,还需要hibernate二级缓存么

问题描述 如果项目已有spring缓存,还需要hibernate二级缓存么 如果项目已有spring缓存,还需要hibernate二级缓存么,RT 解决方案 Spring环境下Hibernate二级缓存的应用---------------------- 解决方案二: 不是太清楚,大家一起学习

缓存机制-hibernate二级缓存问题。

问题描述 hibernate二级缓存问题. 我把 List teams = meaulInter.executeQuery(""from Team""); 这个查询出来的结果放到了二级缓存里面.然后这个Team对象 跟 一个 Page 对象 是1对多关系,因此,当我要引出Team对象对应的多方Page对象的属性的时候,会向数据库发出查询语句,我想把查询的结果放到缓存里面我该怎么做,才会令到懒加载的时候能从缓存中取出? 解决方案 参考:http://www.docin

hibernate二级缓存的配置

问题描述 写了一个hibernate二级缓存的例子,从日志中看,似乎二级缓存已经启用,但在执行效果看,没有到二级缓存中查找数据.忘各位高手们帮帮小弟配置文件如下:hibernate.cfg.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/HibernateConfigurationDTD3.0//EN&qu

Hibernate整合spring配置二级缓存

applicationContext.xml 文件配置: <prop key="hibernate.cache.use_second_level_cache">true</prop> <!--设置缓存机制为二级缓存 --> <prop key="hibernate.cache.use_query_cache">true</prop> <!--启动查询缓存 --> <prop key=&qu

Hibernate二级缓存攻略

很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了. 我的经验主要来自hibernate2.1版本,基本原理和3.0.3.1是一样的,请原谅我的顽固不化. hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了. 二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehc

SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示_java

网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要进入商品的详细信息页面,就像淘宝里面那样.那么每次点击都要去后台查询一下该商品的详细信息,就会发送相应的sql语句,每次刷新一下详细页面也会发sql语句,这样的话,性能肯定会受到很大的影响.那么使用Hibernate的二级缓存就可以解决这个问题. 有些人可能会想,我们可以使用重定向,这样的话,在用户第一次访问的时候把信息查出来放到session中,以后每次用户刷新就可以去session中拿了,这样就不用去数据库中

hibernate-关于Hibernate的二级缓存配置

问题描述 关于Hibernate的二级缓存配置 配置二级缓存时在实体xx.hbm.xml中配置的 <cache usage="read-only" include="non-lazy" region="personCache"/> 关于这个include属性,我看官方文档上说all是对所有属性就行缓存,non-lazy是对不是lazy加载的属性缓存,问题是我怎么判断它到底有没有对lazy="true"的属性缓存呢?

Hibernate的二级缓存问题

问题描述 Hibernate的二级缓存问题 1.hibernate.cfg.xml配置如下 <!-- 设置二级缓存供应商 --> <property name="cache.provider_class"> org.hibernate.cache.EhCacheProvider </property> <!-- 开启二级缓存 --> <property name="cache.use_second_level_cache&

详解Java的Hibernate框架中的缓存与二级缓存_java

缓存 今天我们就来讲一下hibernate中实体状态和hibernate缓存.  1)首先我们先来看一下实体状态:  实体状态主要分三种:transient,persitent,detached.  看英文应该就大概明白了吧.  transient:是指数据还没跟数据库中的数据相对应.  persistent:是指数据跟数据库中的数据相对应,它的任何改变都会反映到数据库中.  detached:是指数据跟数据库中的数据相对应,但由于session被关闭,它所做的修改不会对数据库的记录造成影响.