- 浏览: 443689 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
g_man1990:
update config 不成功啊
build-helper-maven-plugin 配置多 source resource 文件 -
netwelfare:
文章很详细,就是太长了,读起来有点困难,倒不如写精练点,像这篇 ...
Java 基本类型 -
huyuancai1010:
function commitForm() {
var ...
加时间戳或者随机数去除js缓存 -
Smile__:
不过这个东西以前还真没研究过 。
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size -
Smile__:
想不到你也是北大青鸟的 。哈
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
经常看到session.get()和session.load()方法的区别,书上说load方法可以充分利用二级缓存中的现有数据,而get方法仅在内部缓存进行数据查找,如果没有查找到数据,将越过二级缓存,直接调用SQL完成数据读取。可我试了试,执行结果确实两个方法都充分利用了二级缓存。
代码如下:
TuserDAO
- package org.xiyou;
- import java.util.Iterator;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.criterion.Expression;
- public class TuserDAO {
- public void get()
- {
- SessionFactory sessionFactory=new Configuration().configure("org/xiyou/hibernate.cfg.xml").buildSessionFactory();
- Session session=sessionFactory.openSession();
- Tuser user=(Tuser)session.get(Tuser.class, new Integer(3));
- System.out.println(user.getName());
- session.close();
- Session session1=sessionFactory.openSession();
- Tuser user1=(Tuser)session1.get(Tuser.class, new Integer(3));
- System.out.println(user1.getName());
- System.out.println((session.equals(session1)));
- session1.close();
- }
- /*
- * 测试Session.load()
- *
- *
- * */
- public void load()
- {
- SessionFactory sessionFactory=new Configuration().configure("org/xiyou/hibernate.cfg.xml").buildSessionFactory();
- Session session=sessionFactory.openSession();
- Tuser user=(Tuser)session.load(Tuser.class, new Integer(3));
- System.out.println(user.getName());
- session.close();
- Session session1=sessionFactory.openSession();
- Tuser user1=(Tuser)session1.load(Tuser.class, new Integer(3));
- System.out.println(user1.getName());
- session1.close();
- System.out.println((session.equals(session1)));
- }
- }
测试类:
- package org.xiyou;
- public class Test01 {
- public static void main(String [] args)
- {
- TuserDAO userdao=new TuserDAO();
- userdao.get2();
- userdao.load();
- }
- }
Java代码
- Hibernate: select tuser0_.id as id0_, tuser0_.version as version0_0_, tuser0_.name as name0_0_ from test.tuser tuser0_ where tuser0_.id=?
- aaaa
- aaaa
- false
- aaaa
- aaaa
- false
hibernate.cfg.xml
- <?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>
<?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
- <?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>
<?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
- <?xml version="1.0" encoding="UTF-8"?>
- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
- <diskStore path="java.io.tmpdir" />
- <defaultCache
- maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="120"
- timeToLiveSeconds="120"
- overflowToDisk="true"
- diskPersistent="false"
- diskExpiryThreadIntervalSeconds="120"
- memoryStoreEvictionPolicy="LRU" />
- </ehcache>
源码(3.2.6.ga),确实如此
先看一下Session的默认实现SessionImpl
get方法会转到fireLoad,loadType的值是LoadEventListener.GET
load方法也是转到fireLoad,不同的是loadType的值是LoadEventListener.LOAD
- 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);
- }
- }
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
- 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);//从二级缓存加载
- 。。。。。。
- }
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也会使用二级缓存
发表评论
-
Hibernate search
2011-02-21 14:44 3390Hibernate Search是Hibernate的子项目, ... -
SimpleJdbc
2010-05-26 17:21 1907SimpleJdbcInsert类和SimpleJdbcCal ... -
Hibernate 注解 annotation
2010-05-05 20:37 15000一、 实体 Bean 每个持久化POJO类都是一个实体Bea ... -
Hibernate 拦截器 和 监听器
2009-11-25 11:29 1846拦截器(Intercept):顾名思义,拦截操作,也就是在Hi ... -
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
2009-11-17 17:32 19863hibernate.jdbc.fetch_size 50 h ... -
Hibernate 二级缓存 和 查询缓存
2009-09-22 11:19 3037自己测试的一些结果 , ... -
Query.list 与 Query.iterate 的区别
2009-09-03 17:08 1912list: 结果存入缓存,但不从缓存里面取;查询时属性连同id ... -
Jdbc 与 Jta 事务
2009-08-26 14:35 2642hibernate的两种事务管理jdbc 和jta方式。下边说 ... -
Hibernate Session Flush
2009-08-14 11:34 8574session flush在commit之前默 ... -
GenericSpringDAO<T extends ...>
2009-08-03 10:06 1498import java.io.Serializable;imp ... -
Hibernate Annotation driven equals and hashCode
2009-07-03 16:56 1444The following implementation of ... -
hibernate cascade inverse
2009-06-28 19:43 1117这两个属性都用于一多 ... -
Hibernate Criteria
2009-06-19 11:15 1046Hibernate 设计了 CriteriaSpec ... -
Hibernate的Criteria 简单用法
2009-05-26 16:52 1767在hibernate的Session里面使用createCri ... -
Hibernate中Criteria的完整用法
2009-05-26 16:46 590Criteria 在查询方法设计上可以灵活的根据 Criter ... -
Hibernate 的连接池属性简介
2009-05-07 11:30 1631Hibernate配置属性 ... -
Hibernate Inverse
2009-04-23 17:15 1261一、Inverse是hibernate双向关系中的基本概念。i ... -
hibernate的hibernate.hbm2ddl.auto属性
2009-01-06 16:33 2334<property name="hibern ... -
hibernate主键常用方式
2009-01-06 16:32 10131) assigned 主键由外部程序负责生成,无需Hibe ...
相关推荐
(见下图,为了减少get这几条网络传输,我们会在每个应用服务器上增加本地的ehcache缓存作为二级缓存,即第一次get到的数据存入ehcache,后面output输出即可从本地ehcache中获取,不用再访问redis了,所以就减少了...
在原代码基础上,添加内存缓存机制,提升常用缓存数据读取速度。 获取顺序:内存缓存->文件缓存---->网络(ACache不含网络读取) 以下有个小的demo,希望您能喜欢: ACache mCache = ACache.get(this); mCache.put...
1、设置 refreshAfterWrite 策略 2、设置@Cacheable的sync同步属性为true 2、Cache.get(key, Callable
1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。 2) 选择合适的缓存插件,然后编辑该插件的配置文件。 2.4. 使用EhCache配置二级缓存: 2.4.1. 配置准备: 1) 把...
get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库
Hibernate中使用了一级缓存和二级缓存的机制来提高程序的性能. 一 为什么要使用缓存? 缓存是一块存储区域,可能是一块内存,也可能是一块硬盘.缓存能起到缓冲的作用,把程序经常使用...
}$dir : 缓存文件存放目录$lifetime : 缓存文件有效期,单位为秒$cacheid : 缓存文件路径,包含文件名$ext : 缓存文件扩展名(可以不用),这里使用是为了查看文件方便析构函数,检查缓存目录是否有效,默认赋值,检查...
load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 get():如果在数据库中没有记录会返回空,get()无论如何都会返回数据. load():如果数据库中没有记录会抛出异常,...
内部的芯片二级缓存运行速率与主频相同,而外部的二级缓存则只有主频的一半。L2高速缓存容量也会影响CPU的性能,原则是越大越好,普通台式机CPU的L2缓存一般为128KB到2MB或者更高,笔记本、服务器和工作站上用CPU的...
HttpLibrary网络加载module, retrofit+okhttp+rxjava,有日志输出,加载图为西瓜,可自己修改颜色啥的,很快会加上二级缓存使用方式如下:0、更改ParamsUtil中的mBaseUrl内容,一半为接口地址的固定头部1、创建一个...
orbit-db使用的同构缓存,对于浏览器使用level.js (indexedDB),对于节点使用leveldown (leveldb)实现。 该项目用在: 。 安装 该项目使用和 npm install --save orbit-db-cache 原料药 公开方法 get 从缓存...
mybatis拥有一级缓存和二级缓存。 3、前端如何传数据到后端。在spring mvc中如何实现 前后端数据的互通是通过Ajax+Json技术实现的。springmvc框架封装了原生mvc,视图层向业务层传递数据时需经过控制层。 4、单...
1.getip 请使用类似熊猫代理填充代理ip,为节省费用,做了文件缓存 2.由于iboxApi接口数据是加密的,使用selenium调用了网站里的js(window.de)解密方法 3.获取商品列表 4.通过机器人滑动验证(未完成)
Hibernate 学习笔记 get和load的区别 一对一,一对多,多对多 悲观锁,乐观锁 hibernate查询语言hql hibernate一级缓存、二级缓存 抓取策略
//该方法会延迟加载/获取数据(只有使用该对象中的字段时才会向数据库发出查询语句),该方法会在内部和二级缓存中查找数据,当数据库中没有要查询的数据时报ObjectNotFoundException异常 (7).createQuery(String HQL)...
22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 第23章 管理Session和实现对话 23.1 管理Session对象的生命周期 23.1.1 Session对象的生命周期与本地线程绑定 ...
22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 第23章 管理Session和实现对话 23.1 管理Session对象的生命周期 23.1.1 Session对象的生命周期与本地线程绑定 ...
22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 第23章 管理Session和实现对话 23.1 管理Session对象的生命周期 23.1.1 Session对象的生命周期与本地线程绑定 ...
22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的范例程序 22.6 小结 22.7 思考题 第23章 管理Session和实现对话 23.1 管理Session对象的生命周期 23.1.1 Session对象的生命周期与本地线程绑定 ...