`

Hibernate + EhCache 实现数据缓存的处理

阅读更多
大家都了解对于信息的展示应用中解决对数据库的频繁访问主要有两种手段。
其一是生成静态文件进行存储,其二是采用数据换成技术。
hibernate + ehcache 就是采用第二种方式,也就是对数据的首次访问时取得读取数据,并应用缓存配置的吧取得的数据进行缓存,
以备下次读取时直接从缓存数据中读取,无需再次访问数据库。
hibernate 3.2
echache 1.2.3
eclipse 3.3

EhCache是一个纯Java程序,可以在Hibernate中作为一个插件引入。它具有运行速度快、结构简单、占用内存小、很小的依赖性、支持多CPU服务器、文档齐全等特点。

至于hibernate的使用这里不做介绍
用于EhCache是以插件形式加载的所以只需在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="cache.provider_class">
		org.hibernate.cache.EhCacheProvider
	</property>
	<property name="hibernate.cache.use_query_cache">true</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<!-- 指定连接数据库的url,hibernate连接的数据库名 -->
	<property name="connection.url">
		jdbc:mysql://localhost/test
	</property>
	<!-- 数据库用户名 -->
	<property name="connection.username">root</property>
	<!-- 数据库密码 -->
	<property name="connection.password">root</property>
	<!--用c3p0连接池连接所允许的最大连接数-->
	<property name="hibernate.c3p0.max_size">20</property>
	<!-- c3p0所允许的最少连接数 -->
	<property name="hibernate.c3p0.min_size">1</property>
	<!-- 指定连接池连接失效的时间 -->
	<property name="hibernate.c3p0.timeout">50</property>
	<!-- 指定连接池缓存最大的存储多少个statement -->
	<property name="hibernate.c3p0.max_statements">100</property>
	<!-- hibernate.c3p0.timeout表示连接对象多长时间应该被销毁,
		注意,是”应该“,但是谁来销毁它呢,需要一个线程按照hibernate.c3p0.idle_test_period
		设定的时间间隔去自动校验这些链接对象并销毁timeout的 -->
	<property name="hibernate.c3p0.idle_test_period">30</property>
	<!--  当连接池里面的连接用完的时候,C3P0一下获取的新的连接数  -->
	<property name="hibernate.c3p0.acquire_increment">2</property>
	<!-- 连接数据库的数据库方言 org.hibernate.dialect.MySQLDialect-->
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	<!-- 每次都验证连接是否可用 -->
	<property name="hibernate.c3p0.validate">true</property>
	<property name="show_sql">true</property>
	<mapping resource="test/hibernate/Test.hbm.xml" />
</session-factory>

</hibernate-configuration>

其中
<property name="cache.provider_class">
		org.hibernate.cache.EhCacheProvider
	</property>
	<property name="hibernate.cache.use_query_cache">true</property>

是对EhCache以及hibernate使用缓存的配置。
接下来在src根目录中创建缓存策略文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
 <diskStore path="ehcache"/> //缓存目录
  <defaultCache
	maxElementsInMemory="100000" //缓存中允许创建的最大对象数
	eternal="false"  //缓存中对象是否为永久的
	overflowToDisk="true" //是否启用磁盘缓存
	timeToIdleSeconds="1500" //对象在它过期前的空闲时间
	timeToLiveSeconds="1500"  //对象在它过期前的生存时间
	/>
</ehcache>

创建一个用于测试的数据表
CREATE TABLE `test` (
  `name1` varchar(255) NOT NULL,
  `name2` varchar(255) default NULL,
  `datetime` datetime default NULL,
  PRIMARY KEY  (`name1`)
)

接下来我们需要对实体映射文件中加入缓存配置
以Test对象为例(相关dao 忽略)
<?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 Persistence Tools
-->
<hibernate-mapping>
    <class name="test.hibernate.Test" table="test" catalog="admintools">
    <cache usage="read-write"/>
        <id name="name1" type="string">
            <column name="name1" />
            <generator class="assigned" />
        </id>
        <property name="name2" type="string">
            <column name="name2" />
        </property>
        <property name="datetime" type="timestamp">
            <column name="datetime" length="0" />
        </property>
    </class>
</hibernate-mapping>


<cache
usage="transactional|read-write|nonstrict-read-write|read-only"/>

ehcache 暂不支持transactional。
read-only:无需修改, 那么就可以对其进行只读缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。
read-write:需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level(序列化事务隔离级别)
nonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存策略。

下面我们进行测试
		Test test = new Test();
		test.setName1("name1_2");
		test.setName2("name2_2");
		Session session = HibernateSessionFactory.getSession();
		Transaction tr = session.beginTransaction();
		try{
			session.saveOrUpdate(test);
			tr.commit();
		}catch(HibernateException e){
			System.out.println(e.getMessages());
			tr.rollback();
		}finally{
			session.close();
		}
		System.out.println("-----------");
		session = HibernateSessionFactory.getSession();
		tr = session.beginTransaction();
		try{
			Test tt = (Test) session.get("test.hibernate.Test", "name1_2");
			System.out.println(tt.getName1()+"   "+tt.getName2());
		}catch(HibernateException e){
			e.printStackTrace();
			System.out.println(e.getMessages());
			tr.rollback();
		}finally{
			session.close();
		}
		System.out.println("-----");
		session = HibernateSessionFactory.getSession();
		tr = session.beginTransaction();
		try{
			Test tt = (Test) session.get("test.hibernate.Test", "name1_2");
			System.out.println(tt.getName1()+"   "+tt.getName2());
		}catch(HibernateException e){
			e.printStackTrace();
			System.out.println(e.getMessages());
			tr.rollback();
		}finally{
			session.close();
		}

看一看控制台的输出
Hibernate: select test_.name1, test_.name2 as name2_0_, test_.datetime as datetime0_ from admintools.test test_ where test_.name1=?
-----------
Hibernate: select test0_.name1 as name1_0_0_, test0_.name2 as name2_0_0_, test0_.datetime as datetime0_0_ from admintools.test test0_ where test0_.name1=?
name1_2   name2_2
-----
name1_2   name2_2

我们可以看到第二次查询的时候并没有从数据库中查询。

Java开发Q群:46176507
  • src.rar (5.8 KB)
  • 下载次数: 39
  • lib.rar (7.6 MB)
  • 下载次数: 28
分享到:
评论
1 楼 cfan_haifeng 2012-04-06  
呵呵,恰好使用

相关推荐

    Hibernate+ehcache二级缓存技术

    Hibernate+ehcache二级缓存技术 Hibernate+ehcache二级缓存技术

    hibernate+ehcache

    一级缓存是每个 Hibernate Session 的私有缓存,而二级缓存则可以跨 Session 共享,Ehcache 就是常见的二级缓存实现。 7. **事务管理**:在整合 Hibernate 和 Ehcache 时,必须注意事务管理,确保缓存与数据库的...

    struts2+hibernate+ehcache二级缓存

    在提供的压缩包文件中,可能包含了Struts2、Hibernate和Ehcache的配置示例,以及相关的代码片段,用于演示如何集成和使用这些组件实现二级缓存。开发者可以通过分析这些文件,了解具体的实现细节,并在自己的项目中...

    spring boot 使用jsp 集成hibernate+shiro+ehcache项目分享

    在这个项目中,我们将深入探讨如何将 Spring Boot 与 Hibernate、Shiro 和 Ehcache 结合,以实现一个高效且安全的 Web 应用。 **1. Spring Boot 与 Hibernate 集成** Hibernate 是一个强大的对象关系映射(ORM)...

    Struts2+Spring+Hibernate+Ehcache+AJAX+JQuery+Oracle 框架集成用户登录注册Demo工程

    1.通过google ehcache-spring-annotatios.jar自动注解方式实现整合Spring+Ehcache。 2.Action里通过struts2-spring-plugin.jar插件自动根据名字注入。 3.Ajax无刷新异步调用Struts2,返回Json数据,以用户注册为例。...

    Spring+Hibernate+ehcache整合

    1. **Spring配置**:Spring的配置文件(如`applicationContext.xml`)会定义bean,包括数据源、SessionFactory(Hibernate)、缓存管理器(Ehcache)以及业务层和服务层的组件。通过依赖注入,Spring将这些组件装配...

    spring+springmvc+hibernate+ehcache JavaWeb后台框架

    spring+springmvc+hibernate+ehcache JavaWeb后台框架,不仅提高了开发程序的速度,且其中还是用到hibernate和ehcache缓存的使用,加快了程序运行的数据,该框架亲测好用。值得注意的是该种框架现在还算是用的比较多...

    hibernate+ehcache jar包

    Hibernate提供了对缓存的支持,其中Ehcache是常用的二级缓存实现。在Hibernate中,一级缓存是Session级别的,每个Session内部都会有一个缓存,用于存储当前Session中的对象;二级缓存则是SessionFactory级别的,它...

    jar包整合:Springmvc+hibernate+Ehcache+shior+mysql+Oracle+fastjson

    在Java应用中,Ehcache用于存储频繁访问的数据,减少数据库的访问压力,提供缓存管理策略,如LRU(最近最少使用)算法。 4. **Shiro**:Apache Shiro是一个安全管理框架,它负责身份认证、授权(权限控制)、会话...

    Hibernate+EhCache配置及使用说明详解

    EhCache 是 Hibernate 的二级缓存技术之一,可以把查询出来的数据存储在内存或者磁盘,节省下次同样查询语句再次查询数据库,大幅减轻数据库压力。 EhCache 的使用注意点: 1. 当用 Hibernate 的方式修改表数据...

    hibernate+ehcache代码示例

    Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,而Ehcache则是一种高效的分布式缓存系统,常用于提高数据访问速度和减轻数据库压力。 **Hibernate** 是一个流行的ORM框架,它允许开发者使用...

    DWZ+springMvc+hibernate+ehcache 简易的后台管理+即时通讯

    标题中的“DWZ+springMvc+hibernate+ehcache 简易的后台管理+即时通讯”揭示了这个项目采用的技术栈,包括前端框架、后端框架、持久层框架以及缓存管理工具。让我们逐一深入理解这些技术点: 1. **DWZ**:DWZ全称为...

    Hibernate4 + Ehcache 例子

    标题 "Hibernate4 + Ehcache 例子" 暗示了我们将探讨如何在Java应用程序中集成Hibernate4 ORM框架和Ehcache缓存系统。这个例子可能是关于如何提高数据访问性能,通过缓存策略来减少数据库查询的次数。 描述中的链接...

    ssh,struts+hibernate+spring+ehcache集成

    例如,为了使用Ehcache,需要在Spring配置文件中添加Ehcache的相关bean,然后在Hibernate的SessionFactory配置中启用二级缓存。此外,还需要在Struts的Action中调用由Spring管理的业务服务,这些服务通常会利用...

    Spring+MyBatis/Hibernate+Ehcache+Maven的Demo Web项目(稳定版)

    3.Ehcache方法缓存及页面缓存。见applicationContext-cache.xml及web.xml的pageEhCacheFilter 4.MyBatis+Maven代码生成工具。见bin目录 5.作为项目或者技术研究的基础架构。必要的jar包依赖都已配置好,基本都采用较...

    SpringMVC+hibernate+spring+shiro+Ehcache所需jar包

    SpringMVC负责处理HTTP请求和视图展示,Spring作为核心框架进行依赖管理和事务控制,Hibernate则处理数据库操作,Shiro保障应用的安全性,而Ehcache则优化了数据访问性能。这些jar包的组合使得开发者能够快速地搭建...

    Spring+MyBatis/Hibernate+Ehcache+Maven的Demo Web项目

    3.Ehcache方法缓存及页面缓存。见applicationContext-cache.xml及web.xml的pageEhCacheFilter 4.MyBatis+Maven代码生成工具。见bin目录 5.作为项目或者技术研究的基础架构。必要的jar包依赖都已配置好,基本都采用较...

    Maven项目Spring4+Hibernate4+shiro+Ehcache项目集成

    在本项目中,我们主要探讨的是一个基于Maven构建的Java Web应用,它整合了Spring 4、Hibernate 4、Apache Shiro以及Ehcache等多个关键框架,旨在实现用户角色菜单管理的功能。以下是对这些技术及其集成应用的详细...

Global site tag (gtag.js) - Google Analytics