- 浏览: 449961 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 3427Hibernate Search是Hibernate的子项目, ... -
SimpleJdbc
2010-05-26 17:21 1932SimpleJdbcInsert类和SimpleJdbcCal ... -
Hibernate 注解 annotation
2010-05-05 20:37 15035一、 实体 Bean 每个持久化POJO类都是一个实体Bea ... -
Hibernate 拦截器 和 监听器
2009-11-25 11:29 1885拦截器(Intercept):顾名思义,拦截操作,也就是在Hi ... -
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
2009-11-17 17:32 19933hibernate.jdbc.fetch_size 50 h ... -
Hibernate 二级缓存 和 查询缓存
2009-09-22 11:19 3073自己测试的一些结果 , ... -
Query.list 与 Query.iterate 的区别
2009-09-03 17:08 1950list: 结果存入缓存,但不从缓存里面取;查询时属性连同id ... -
Jdbc 与 Jta 事务
2009-08-26 14:35 2672hibernate的两种事务管理jdbc 和jta方式。下边说 ... -
Hibernate Session Flush
2009-08-14 11:34 8630session flush在commit之前默 ... -
GenericSpringDAO<T extends ...>
2009-08-03 10:06 1530import java.io.Serializable;imp ... -
Hibernate Annotation driven equals and hashCode
2009-07-03 16:56 1481The following implementation of ... -
hibernate cascade inverse
2009-06-28 19:43 1156这两个属性都用于一多 ... -
Hibernate Criteria
2009-06-19 11:15 1071Hibernate 设计了 CriteriaSpec ... -
Hibernate的Criteria 简单用法
2009-05-26 16:52 1812在hibernate的Session里面使用createCri ... -
Hibernate中Criteria的完整用法
2009-05-26 16:46 625Criteria 在查询方法设计上可以灵活的根据 Criter ... -
Hibernate 的连接池属性简介
2009-05-07 11:30 1661Hibernate配置属性 ... -
Hibernate Inverse
2009-04-23 17:15 1284一、Inverse是hibernate双向关系中的基本概念。i ... -
hibernate的hibernate.hbm2ddl.auto属性
2009-01-06 16:33 2383<property name="hibern ... -
hibernate主键常用方式
2009-01-06 16:32 10521) assigned 主键由外部程序负责生成,无需Hibe ...
相关推荐
3. 编写Mybatis的配置:在mybatis-config.xml文件中,启用全局的二级缓存并指定使用Redis作为缓存实现。 ```xml <!-- Redis相关配置 --> ``` 4. 定义Mapper缓存:在每个Mapper接口或XML配置文件...
5. 应用到查询:对于查询结果,可以使用`SessionFactory.getCache()`方法获取二级缓存对象,然后进行相关的读写操作。 在源码实例中,你可以看到如何在代码层面与二级缓存进行交互,例如通过SessionFactory的get...
1. **导入依赖**:首先,你需要添加ehcache库的jar包到项目的类路径中,因为Hibernate通常使用ehcache作为默认的二级缓存提供者。 2. **配置二级缓存**:在`hibernate.cfg.xml`配置文件中,需要指定二级缓存的提供...
1. **加载实体**:当通过`session.get()`或`session.load()`方法加载实体时,Hibernate首先检查二级缓存,然后是一级缓存,最后才是数据库。 2. **更新实体**:当对实体进行修改时,如果启用了`read-write`缓存策略...
要将MyBatis的二级缓存与Redis集成,首先需要在MyBatis的配置文件中定义自定义的Cache实现类,这个类通常会基于Java的Jedis库来操作Redis。在实现类中,你需要覆盖`put`、`get`、`remove`等关键方法,以实现数据的...
但需要注意的是,二级缓存可能会增加数据的一致性风险,因为不同事务可能同时修改缓存中的同一数据。 使用JPA的二级缓存,我们需要进行以下几个步骤: 1. **选择缓存提供商**:JPA本身并不提供二级缓存实现,而是...
通过使用二级缓存,可以显著提高应用性能,尤其是在频繁查询相同数据的情况下。 #### 三、配置与实现 **1. 配置 EhCache** 为了使用Hibernate的二级缓存功能,首先需要配置EhCache。EhCache 是一个开源的、高性能...
MyBatis Plus 使用 Redis 作为二级缓存的方法 MyBatis Plus 是一个基于 MyBatis 的增强工具,提供了许多实用的功能,其中之一就是支持使用 Redis 作为二级缓存。本文将详细介绍如何使用 MyBatis Plus 将 Redis 作为...
本文将深入探讨如何使用`LruCache`和`DiskLruCache`实现一个二级缓存的自定义`ImageLoader`。 `LruCache`是Android SDK提供的内存缓存解决方案,全称为"Least Recently Used Cache"(最近最少使用缓存)。它的原理...
当我们通过`Session.get()`检索一个对象时,Hibernate首先检查一级缓存(即Session内部的缓存),如果不在一级缓存中,那么会尝试从二级缓存中查找。如果二级缓存也没有,Hibernate才会去数据库中查询。在这个测试中...
Spring Boot和Redis的结合使用,可以构建出高效、可扩展的二级缓存系统,以减轻数据库的压力。本篇文章将深入探讨如何在Spring Boot 2.x项目中整合Redis作为MyBatis的二级缓存,并实现自定义键、自定义过期时间和...
对于HQL的`list()`查询,它会直接从数据库获取多条记录,并将其存储到二级缓存,以便后续的`get()`和`load()`调用。而`executeUpdate()`这类更新操作同样不支持二级缓存,它会直接作用于数据库。 通过以上配置和...
二级缓存是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接...
"Mybatis 中通过注解开启使用二级缓存" Mybatis 是一个基于 Java 的持久层框架,它提供了一个简单易用的方式来访问数据库。二级缓存是 Mybatis 中的一种缓存机制,它可以将查询结果缓存起来,减少数据库的访问次数...
在这个场景下,我们将探讨如何使用Memcached作为Hibernate的二级缓存,并了解相关的jar包及其作用。 标题提到的"memcached作为hibernate二级缓存必备的jar包",指的是将分布式内存缓存系统Memcached集成到Hibernate...
在原代码基础上,添加内存缓存机制,提升常用缓存数据读取速度。 获取顺序:内存缓存->文件缓存---->网络(ACache不含网络读取) 以下有个小的demo,希望您能喜欢: ACache mCache = ACache.get(this); mCache.put...
通常情况下,只有在对效率有较高要求且需要跨多个Session共享数据时,才会考虑使用二级缓存。 接下来,介绍如何通过注解来配置和使用Hibernate的二级缓存: 1. 开启二级缓存功能:要在Hibernate配置文件中添加开启...