`

get 会使用二级缓存

阅读更多

经常看到session.get()和session.load()方法的区别,书上说load方法可以充分利用二级缓存中的现有数据,而get方法仅在内部缓存进行数据查找,如果没有查找到数据,将越过二级缓存,直接调用SQL完成数据读取。可我试了试,执行结果确实两个方法都充分利用了二级缓存。
代码如下:
  TuserDAO

Java代码 复制代码
  1.   package org.xiyou;   
  2.   
  3. import java.util.Iterator;   
  4. import java.util.List;   
  5.   
  6. import org.hibernate.Criteria;   
  7. import org.hibernate.Query;   
  8. import org.hibernate.Session;   
  9. import org.hibernate.SessionFactory;   
  10. import org.hibernate.Transaction;   
  11. import org.hibernate.cfg.Configuration;   
  12. import org.hibernate.criterion.Expression;   
  13.   
  14. public class TuserDAO {   
  15.      public void get()   
  16.   {   
  17.       SessionFactory sessionFactory=new Configuration().configure("org/xiyou/hibernate.cfg.xml").buildSessionFactory();   
  18.       Session session=sessionFactory.openSession();   
  19.       Tuser user=(Tuser)session.get(Tuser.classnew Integer(3));   
  20.       System.out.println(user.getName());   
  21.       session.close();   
  22.       Session session1=sessionFactory.openSession();   
  23.       Tuser user1=(Tuser)session1.get(Tuser.classnew Integer(3));   
  24.       System.out.println(user1.getName());   
  25.       System.out.println((session.equals(session1)));   
  26.       session1.close();   
  27.   }   
  28.   /*  
  29.    * 测试Session.load()  
  30.    *   
  31.    *   
  32.    * */  
  33.   public void load()   
  34.   {   
  35.       SessionFactory sessionFactory=new Configuration().configure("org/xiyou/hibernate.cfg.xml").buildSessionFactory();   
  36.       Session session=sessionFactory.openSession();   
  37.       Tuser user=(Tuser)session.load(Tuser.classnew Integer(3));   
  38.       System.out.println(user.getName());   
  39.       session.close();   
  40.       Session session1=sessionFactory.openSession();   
  41.       Tuser user1=(Tuser)session1.load(Tuser.classnew Integer(3));   
  42.          
  43.       System.out.println(user1.getName());   
  44.          
  45.       session1.close();   
  46.       System.out.println((session.equals(session1)));   
  47.   }   
  48. }  


测试类:

Java代码 复制代码
  1. package org.xiyou;   
  2.   
  3. public class Test01 {   
  4.    public static void main(String [] args)   
  5.    {   
  6.        TuserDAO userdao=new TuserDAO();   
  7.        userdao.get2();   
  8.        userdao.load();   
  9.     }   
  10. }  
Java代码 
  1. Hibernate: select tuser0_.id as id0_, tuser0_.version as version0_0_, tuser0_.name as name0_0_ from test.tuser tuser0_ where tuser0_.id=?   
  2. aaaa   
  3. aaaa   
  4. false  
  5. aaaa   
  6. aaaa   
  7. false  

hibernate.cfg.xml 
Java代码 复制代码
  1. <?xml version='1.0' encoding='UTF-8'?>   
  2. <!DOCTYPE hibernate-configuration PUBLIC   
  3.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">   
  5.   
  6. <!-- Generated by MyEclipse Hibernate Tools.                   -->   
  7. <hibernate-configuration>   
  8.   
  9. <session-factory>   
  10.     <property name="dialect">   
  11.         org.hibernate.dialect.MySQLDialect   
  12.     </property>   
  13.     <property name="connection.url">   
  14.         jdbc:mysql://localhost/test   
  15.     </property>   
  16.     <property name="connection.username">root</property>   
  17.     <property name="connection.password">123</property>   
  18.     <property name="connection.driver_class">   
  19.         com.mysql.jdbc.Driver   
  20.     </property>   
  21.     <property name="myeclipse.connection.profile">mysql</property>   
  22.     <property name="show_sql">true</property>   
  23. <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>   
  24.     <mapping resource="org/xiyou/Tuser.hbm.xml" />   
  25.   
  26. </session-factory>   
  27.   
  28. </hibernate-configuration>  
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	<property name="connection.url">
		jdbc:mysql://localhost/test
	</property>
	<property name="connection.username">root</property>
	<property name="connection.password">123</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="myeclipse.connection.profile">mysql</property>
	<property name="show_sql">true</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
	<mapping resource="org/xiyou/Tuser.hbm.xml" />

</session-factory>

</hibernate-configuration>


Tuser.hbm.xml

Java代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
  4. <!--    
  5.     Mapping file autogenerated by MyEclipse - Hibernate Tools   
  6. -->   
  7. <hibernate-mapping>   
  8.     <class name="org.xiyou.Tuser" table="tuser" catalog="test" >   
  9.     <cache usage="read-only"/>   
  10.         <id name="id" type="java.lang.Integer">   
  11.             <column name="id" />   
  12.             <generator class="native" />   
  13.         </id>   
  14.         <property name="version"  
  15.                  column="version"  
  16.                  type="integer"></property>   
  17.         <property name="name" type="java.lang.String">   
  18.             <column name="name" length="20" />   
  19.         </property>   
  20.   
  21.     </class>   
  22. </hibernate-mapping>  
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="org.xiyou.Tuser" table="tuser" catalog="test" >
    <cache usage="read-only"/>
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="version"
                 column="version"
                 type="integer"></property>
        <property name="name" type="java.lang.String">
            <column name="name" length="20" />
        </property>

    </class>
</hibernate-mapping>


ehcache.xml

Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">   
  3.     <diskStore path="java.io.tmpdir" />   
  4.     <defaultCache    
  5.         maxElementsInMemory="10000"    
  6.         eternal="false"    
  7.         timeToIdleSeconds="120"    
  8.         timeToLiveSeconds="120"    
  9.         overflowToDisk="true"    
  10.         diskPersistent="false"    
  11.         diskExpiryThreadIntervalSeconds="120"    
  12.         memoryStoreEvictionPolicy="LRU" />   
  13. </ehcache>  

 

 

 

 

源码(3.2.6.ga),确实如此

先看一下Session的默认实现SessionImpl
get方法会转到fireLoad,loadType的值是LoadEventListener.GET
load方法也是转到fireLoad,不同的是loadType的值是LoadEventListener.LOAD

Java代码 复制代码
  1. private void fireLoad(LoadEvent event, LoadType loadType) {   
  2.     errorIfClosed();   
  3.     checkTransactionSynchStatus();   
  4.     LoadEventListener[] loadEventListener = listeners.getLoadEventListeners();   
  5.     for ( int i = 0; i < loadEventListener.length; i++ ) {   
  6.         loadEventListener[i].onLoad(event, loadType);   
  7.     }   
  8. }  
private void fireLoad(LoadEvent event, LoadType loadType) {
	errorIfClosed();
	checkTransactionSynchStatus();
	LoadEventListener[] loadEventListener = listeners.getLoadEventListeners();
	for ( int i = 0; i < loadEventListener.length; i++ ) {
		loadEventListener[i].onLoad(event, loadType);
	}
}

 调用loadEventListener的onLoad方法
LoadEventListener的默认实现DefaultLoadEventListener中
最终会转到doLoad方法,options就是前面的loadType

Java代码 复制代码
  1. protected Object doLoad(   
  2.             final LoadEvent event,   
  3.             final EntityPersister persister,   
  4.             final EntityKey keyToLoad,   
  5.             final LoadEventListener.LoadType options) throws HibernateException {   
  6.     。。。。。。   
  7.     Object entity = loadFromSessionCache( event, keyToLoad, options );//从一级缓存加载   
  8.     //如果不为空,直接返回   
  9.     。。。。。。   
  10.     entity = loadFromSecondLevelCache(event, persister, options);//从二级缓存加载   
  11.     。。。。。。   
  12. }  
protected Object doLoad(
			final LoadEvent event,
			final EntityPersister persister,
			final EntityKey keyToLoad,
			final LoadEventListener.LoadType options) throws HibernateException {
	。。。。。。
	Object entity = loadFromSessionCache( event, keyToLoad, options );//从一级缓存加载
	//如果不为空,直接返回
	。。。。。。
	entity = loadFromSecondLevelCache(event, persister, options);//从二级缓存加载
	。。。。。。
}

 loadFromSecondLevelCache即是从二级缓存中查找对象
get和load的区别在于LoadEventListener.LoadType options参数,一个是LoadEventListener.GET,一个是LoadEventListener.LOAD
而在这个方法中,并没有用到options参数
也就是说get和load使用二级缓存的状况是一样的,get也会使用二级缓存

分享到:
评论

相关推荐

    spring-ehcache-redis两级缓存

    (见下图,为了减少get这几条网络传输,我们会在每个应用服务器上增加本地的ehcache缓存作为二级缓存,即第一次get到的数据存入ehcache,后面output输出即可从本地ehcache中获取,不用再访问redis了,所以就减少了...

    ASimpleCache二级缓存修改

    在原代码基础上,添加内存缓存机制,提升常用缓存数据读取速度。 获取顺序:内存缓存-&gt;文件缓存----&gt;网络(ACache不含网络读取) 以下有个小的demo,希望您能喜欢: ACache mCache = ACache.get(this); mCache.put...

    ck-jesse#l2cache#二级缓存最佳实践用法1

    1、设置 refreshAfterWrite 策略 2、设置@Cacheable的sync同步属性为true 2、Cache.get(key, Callable

    hibernate 3中的缓存小结

    1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。 2) 选择合适的缓存插件,然后编辑该插件的配置文件。 2.4. 使用EhCache配置二级缓存: 2.4.1. 配置准备: 1) 把...

    hibernate get load区别

    get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库

    hibernate基础教程

    Hibernate中使用了一级缓存和二级缓存的机制来提高程序的性能. 一 为什么要使用缓存? 缓存是一块存储区域,可能是一块内存,也可能是一块硬盘.缓存能起到缓冲的作用,把程序经常使用...

    简单高效的文件缓存php类.zip

     }$dir : 缓存文件存放目录$lifetime : 缓存文件有效期,单位为秒$cacheid : 缓存文件路径,包含文件名$ext : 缓存文件扩展名(可以不用),这里使用是为了查看文件方便析构函数,检查缓存目录是否有效,默认赋值,检查...

    hibernate查询与缓存

    load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 get():如果在数据库中没有记录会返回空,get()无论如何都会返回数据. load():如果数据库中没有记录会抛出异常,...

    用于缓存的PHP库.zip

    内部的芯片二级缓存运行速率与主频相同,而外部的二级缓存则只有主频的一半。L2高速缓存容量也会影响CPU的性能,原则是越大越好,普通台式机CPU的L2缓存一般为128KB到2MB或者更高,笔记本、服务器和工作站上用CPU的...

    HttpLibrary:网络加载module, retrofit+okhttp+rxjava,有日志输出,加载图为西瓜,可自己修改颜色啥的,很快会加上二级缓存

    HttpLibrary网络加载module, retrofit+okhttp+rxjava,有日志输出,加载图为西瓜,可自己修改颜色啥的,很快会加上二级缓存使用方式如下:0、更改ParamsUtil中的mBaseUrl内容,一半为接口地址的固定头部1、创建一个...

    orbit-db-cache:orbit-db的本地缓存

    orbit-db使用的同构缓存,对于浏览器使用level.js (indexedDB),对于节点使用leveldown (leveldb)实现。 该项目用在: 。 安装 该项目使用和 npm install --save orbit-db-cache 原料药 公开方法 get 从缓存...

    往届师兄师姐面试真题收集(Java相关岗位)

    mybatis拥有一级缓存和二级缓存。 3、前端如何传数据到后端。在spring mvc中如何实现 前后端数据的互通是通过Ajax+Json技术实现的。springmvc框架封装了原生mvc,视图层向业务层传递数据时需经过控制层。 4、单...

    java post代理ip模拟请求提交结合selenium 抢购ibox二级科技脚本

    1.getip 请使用类似熊猫代理填充代理ip,为节省费用,做了文件缓存 2.由于iboxApi接口数据是加密的,使用selenium调用了网站里的js(window.de)解密方法 3.获取商品列表 4.通过机器人滑动验证(未完成)

    Hibernate学习笔记

    Hibernate 学习笔记 get和load的区别 一对一,一对多,多对多 悲观锁,乐观锁 hibernate查询语言hql hibernate一级缓存、二级缓存 抓取策略

    hibernate操作数据库笔记

    //该方法会延迟加载/获取数据(只有使用该对象中的字段时才会向数据库发出查询语句),该方法会在内部和二级缓存中查找数据,当数据库中没有要查询的数据时报ObjectNotFoundException异常 (7).createQuery(String HQL)...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     22.4.4 Session与第二级缓存的交互模式  22.5 运行本章的范例程序  22.6 小结  22.7 思考题 第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     22.4.4 Session与第二级缓存的交互模式  22.5 运行本章的范例程序  22.6 小结  22.7 思考题 第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     22.4.4 Session与第二级缓存的交互模式  22.5 运行本章的范例程序  22.6 小结  22.7 思考题 第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     22.4.4 Session与第二级缓存的交互模式  22.5 运行本章的范例程序  22.6 小结  22.7 思考题 第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  ...

Global site tag (gtag.js) - Google Analytics