`

Hibernate中二级缓存的配置

 
阅读更多

我们知道

hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了,所以一级缓存默认Hibernate就提供了。

二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等,需要设置hibernate.cache.provider_class,我们这里用ehcache,在2.1中就是
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
如果使用查询缓存,加上
hibernate.cache.use_query_cache=true

缓存可以简单的看成一个Map,通过key在缓存里面找value。

下面开始配置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">
<hibernate-configuration>
	<session-factory>
		<property name="connection.username">root</property>
		<property name="connection.password">mysql</property>
		<property name="connection.url">jdbc:mysql://localhost/mysqldemo</property>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		<!--自动在数据库中生成表
		<property name="hibernate.hbm2ddl.auto">create</property>
		-->
		
		<!-- 开启二级缓存 -->
		<property name="hibernate.cache.use_second_level_cache">true</property>
		<!-- 设置缓存提供者 -->
		<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
		<!-- 查询缓存 -->
		<property name="hibernate.cache.use_query_cache">true</property>
		
		<!-- 映射文件 -->
		<mapping resource="pack/java/hibernate/mapping/User.hbm.xml"/>
		
		<!-- 指定哪些实体需要使用二级缓存,usage属性指定缓存的策略 -->
		<class-cache usage="read-only" class="pack.java.hibernate.pojo.User"/>
	</session-factory>
</hibernate-configuration>

 

在Hibernate.cfg.xml文件中开启了二级缓存,查询缓存和设置缓存的提供者,以及指定了那些实体需要使用二级缓存。

 

如果你使用的二级缓存实现是ehcache的话,需要配置ehcache.xml
内容如下:

<echcache>
	<diskStore path="java.io.tmpdir"/>
	<!-- 
		默认缓存配置;
		maxElementslnMemory 属性指定缓存中最多可以放多少个对象
		eternal 属性指定缓存是否永久有效
		timeToldleSeconds 属性指定缓存多久未被使用便清理掉
		timeToLiveSecods  属性指定缓存的生命长度
		diskPersistent 属性指定缓存是否被持久化硬盘中,保存路径由标签指定。
	 -->
	<defaultCache 
		maxElementslnMemory="10000"   
		eternal="false" 
		overflowToDisk="true" 
		timeToldleSeconds="120" 
		timeToLiveSecods="120" 
		diskPersistent="false" />
</echcache>

 

然后,在建立一个User.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">
<hibernate-mapping>
 <class name="pack.java.hibernate.pojo.User" table="User">
  <!-- 使用这种方式也可以应用缓存 
  	<cache usage="read-only"/>
  -->
  <id name="uid" column="UID" type="java.lang.Integer">
  	<generator class="identity"></generator>
  </id>
  <property name="uname" column="UNAME"></property>
  <property name="age" column="AGE"></property>
  <property name="address" column="ADDRESS"></property>
  <property name="sex" type="java.lang.Boolean">
  	<column name="SEX" sql-type="tinyint"></column>
  </property>
  <property name="remark" column="REMARK"></property>
 </class>
</hibernate-mapping>

 

 

定义个Model取名为User:

public class User implements Serializable{
	private static final long serialVersionUID = 1628733968156346447L;
	private Integer uid;
	private String uname;
	private Integer age;
	private String address;
	private Boolean sex;
	private String remark;
        //getter和setter方式省略
}

 

然后就是建立一个测试类:

/**
	 * 查询所有用户信息;
	 */
	@SuppressWarnings("unchecked")
	public List<User> queryUser() {
		// TODO Auto-generated method stub
		if(session==null){
			session = getSession();
		}
	    query = session.createQuery("from "+User.class.getName()+" u where u.uname in('100','101','102','103','104','105')");
		query.setCacheable(true);
		query.setFirstResult((0)*1000).setMaxResults(1000);
		List<User> list = query.list();
		for(User user:list){
			System.out.println("~~~~~~~~"+user.getUid()+","+user.getUname()+","+user.getSex()+","+user.getAddress());
		}
		session.close();
		
		if(!session.isOpen()){
			session = getSession();
		}
		User user = (User) session.get(User.class,  29145);
		query.setCacheable(true);
		System.out.println("~~~~~~~~"+user.getUid()+","+user.getUname()+","+user.getSex()+","+user.getAddress());
		session.close();
		return list;
	}

 

在结果中Hibernate只会去查询一次数据库..然后把结果放到二级缓存中..第二次查询时,如果查询的结果在二级缓存中,就直接从二级缓存中取.如果二级缓存中不存在.则会到数据库中取出.

 

这里说明一点.网上有些人说使用get的方式不会在二级缓存中取..

其实不是..get 和 load方法都会在二级缓存中取数据.

 

 

分享到:
评论

相关推荐

    Spring集成的Hibernate配置二级缓存

    以EhCache为例,我们需要在项目中引入ehcache-core或ehcache的依赖,并在Hibernate配置文件(hibernate.cfg.xml或persistence.xml)中启用二级缓存,添加如下配置: ```xml &lt;property name="hibernate.cache.use_...

    为Spring集成的Hibernate配置二级缓存

    在Java企业级开发中,Spring和Hibernate是两个非常...3. **配置Spring**:在Spring的配置文件(如`applicationContext.xml`)中,配置Hibernate SessionFactory,并注入二级缓存配置。以下是一个配置示例: ```xml ...

    hibernate一级和二级缓存配置与详解

    然后,在`hibernate.cfg.xml`配置文件中,指定缓存提供者,并开启二级缓存: ```xml &lt;property name="hibernate.cache.region.factory_class"&gt;org.hibernate.cache.ehcache.EhCacheRegionFactory &lt;property name="...

    hibernate5.1二级缓存包

    2. **配置**:在 Hibernate 的配置文件(如 hibernate.cfg.xml)中启用二级缓存,并指定使用的缓存提供商。例如,如果使用 Ehcache,需要设置 `&lt;property name="hibernate.cache.use_second_level_cache"&gt;true...

    hibernate一级缓存和二级缓存的区别与联系

    二级缓存可以通过设置不同的并发访问策略来解决并发问题,如事务型、读写型或非严格读写型,以适应不同场景下的需求。 持久化层的缓存范围决定了缓存的生命周期和访问权限。事务范围的缓存最安全,但只限于当前事务...

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    以下是一个简单的二级缓存配置示例: ```xml &lt;hibernate-configuration&gt; &lt;!-- 配置缓存插件 --&gt; &lt;property name="hibernate.cache.region.factory_class"&gt;org.hibernate.cache.ehcache.EhCacheRegionFactory ...

    Hibernate4二级缓存实例(源码)

    这里它被用作Hibernate二级缓存的实现方式,这意味着当数据首次从数据库中读取后,会被存储在memcached中,后续请求可以直接从缓存中获取,避免了频繁的数据库交互,从而提高了系统的响应速度。 **知识点详解:** ...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    通过以上步骤,我们就成功地在Spring Boot 2.1.4.RELEASE项目中配置了使用Redis作为Hibernate二级缓存的环境。这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产...

    hibernate二级缓存实例

    在这个"hibernate二级缓存实例"中,我们将深入探讨二级缓存的原理、配置以及在实际项目中的应用。 首先,我们需要了解一级缓存和二级缓存的区别。一级缓存是Session级别的,每个Session都有自己的一级缓存,用于...

    Hibernate EhCache 二级缓存配置.docx

    Hibernate EhCache 二级缓存配置是 Hibernate 框架中的一种缓存机制,它可以提高应用程序的性能和效率。下面是关于 Hibernate EhCache 二级缓存配置的详细知识点: 一、简介 EhCache 是 Hibernate 的另一个项目,...

    hibernate一级缓存、二级缓存和查询缓存

    - **配置复杂**:二级缓存需要在Hibernate配置文件中指定缓存提供商,并对实体类进行配置,以便它们能够参与缓存。 - **缓存策略**:二级缓存支持不同的缓存策略,如读写策略、只读策略、定时刷新策略等,可以根据...

    hibernate开启二级缓存和查询缓存

    2. 在 Hibernate 配置文件中启用二级缓存。 3. 在实体类上添加 `@Cacheable` 注解或者在映射文件中配置 `&lt;cache&gt;` 元素。 4. 配置实体类的缓存策略,例如使用 `@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)` ...

    Spring4+Hibernate4二级缓存实例源码

    通过这个"Spring4+Hibernate4二级缓存实例源码",你可以学习到如何在实际项目中结合Spring和Hibernate实现二级缓存,提高应用的运行效率。同时,深入理解缓存的工作原理和最佳实践,对于优化系统的性能和架构有着...

    hibernate 二级缓存详解

    配置Ehcache作为二级缓存提供商,需要在Hibernate的配置文件中设置`hibernate.cache.provider_class`为`net.sf.hibernate.cache.EhCacheProvider`。如果启用查询缓存,还需添加`hibernate.cache.use_query_cache=...

    hibernate二级缓存

    在Spring框架中管理SessionFactory时,可以在配置文件中添加相应的bean定义,指定数据源、Hibernate属性以及二级缓存的相关设置。例如,`hibernate.cache.use_query_cache`属性可以开启查询缓存,进一步优化性能。 ...

    hibernate二级缓存示例源码

    综上所述,通过学习`hibernate二级缓存示例源码`,我们可以了解到如何在实际项目中配置和使用Hibernate二级缓存,从而提升系统的性能。在实际应用中,应结合具体场景选择合适的缓存策略,以达到最佳的性能优化效果。

    hibernate二级缓存要导入的包

    本压缩包提供的资源应该包含了实现Hibernate二级缓存所需的关键组件和库文件。 一级缓存是Hibernate Session内的缓存,它是每个Session实例独有的,当Session关闭时,一级缓存中的数据也会被清除。而二级缓存则是一...

    springmvc4+spring4+hibernate5.1.3+二级缓存ehcache+fastjson配置

    在本配置中,Hibernate版本为5.1.3,支持JPA规范,提供了二级缓存功能,提高了数据访问性能。 4. **二级缓存(Ehcache)**: Ehcache是Hibernate的一个可选二级缓存插件,用于存储数据库查询结果,减少对数据库的...

    hibernate的一级缓存和二级缓存

    而二级缓存则需要在配置文件中明确指定,可以针对单个类或集合粒度进行配置。对于读多写少的实体,启用二级缓存能显著提升性能。 一级缓存的管理主要由Session负责,通过evict()和clear()方法控制。evict()用于移除...

Global site tag (gtag.js) - Google Analytics