`

hibernate4 二级缓存demo实例

 
阅读更多

hibernate使用版本是:hibernate-release-4.2.5.Final

需要的jar包:hibernate-release-4.2.5.Final\lib\required下所有jar包

ehcache  jar包:hibernate-release-4.2.5.Final\lib\optional\ehcache下所有包

junit:junit-4.10.jar和mysql-connector-java-5.1.15-bin.jar

注:hibernate 4.2.5版本ehcache缓存不依赖commons-logging-1.1.1.jar,需要的是slf4j-api-1.6.1.jar

项目结构如下
 

 

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection settings -->
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate4</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<!-- JDBC connection pool (use the built-in) -->
		<property name="connection.pool_size">1</property>
		<!-- SQL dialect -->
		<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
		<!-- Enable Hibernate's automatic session context management -->
		<property name="current_session_context_class">thread</property>
		<!-- Disable the second-level cache -->
		<!--<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
		-->
		<!-- 配置二级缓存 -->
		<property name="hibernate.cache.use_second_level_cache">true</property>
		<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
		<!-- hibernate3的二级缓存配置 -->
		<!-- <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> -->
		<!-- 开启查询缓存 -->
		<property name="hibernate.cache.use_query_cache">true</property>
		
		<!-- Echo all executed SQL to stdout -->
		<property name="show_sql">true</property>
		<!-- Drop and re-create the database schema on startup -->
		<property name="hbm2ddl.auto">update</property>
		<mapping class="com.test.pojo.User" />
	</session-factory>
</hibernate-configuration>

 

注意:hibernate4和hibernate3配置不一样,hibernate4是

<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

 

而hibernate3的配置是

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

 此处有一个疑问是:hibernate4的官方文档中,已经把class改了,但是属性名称没有改,还是hibernate.cache.provider_class,不是上面的hibernate.cache.region.factory_class,但是写成hibernate.cache.provider_class会报下面错误

 

org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:186)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:150)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:264)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1790)
	at com.test.pojo.UserTest.beforeClass(UserTest.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given, please either disable second level cache or set correct region factory class name to property hibernate.cache.region.factory_class (and make sure the second level cache provider, hibernate-infinispan, for example, is available in the classpath).
	at org.hibernate.cache.internal.NoCachingRegionFactory.buildTimestampsRegion(NoCachingRegionFactory.java:87)
	at org.hibernate.cache.spi.UpdateTimestampsCache.<init>(UpdateTimestampsCache.java:62)
	at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:72)
	at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:40)
	at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:35)
	at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:91)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:176)
	... 20 more

 说是hibernate.cache.region.factory_class属性没有配置,估计官方文档里没有把属性改过来。。。

 

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
	updateCheck="false">
	<!--
		name:cache唯一标识 
		eternal:缓存是否永久有效 
		maxElementsInMemory:内存中最大缓存对象数
		overflowToDisk(true,false):缓存对象达到最大数后,将缓存写到硬盘中
		diskPersistent:硬盘持久化
		timeToIdleSeconds:缓存清除时间 
		timeToLiveSeconds:缓存存活时间
		memoryStoreEvictionPolicy:缓存清空策略
		1.FIFO:first in first out 先讲先出
		2.LFU: Less Frequently Used 一直以来最少被使用的
		3.LRU:Least Recently Used  最近最少使用的
	-->
	<defaultCache maxElementsInMemory="1000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
	<cache name="userCache" eternal="false" maxElementsInMemory="1000"
		overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="3600"
		timeToLiveSeconds="3600" memoryStoreEvictionPolicy="LFU" />
</ehcache>

 

User实体类

package com.test.pojo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class User {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	private String name;
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

 

UserTest测试类:

package com.test.pojo;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;

public class UserTest {
	
	private static SessionFactory sessionFactory = null;
	@BeforeClass
	public static void beforeClass() {
		Configuration configuration = new Configuration();
		

		try {
			configuration.configure();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			
		
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
	} 
	@Test
	public void testEhcache() {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		User u1 = (User) session.load(User.class, 3);
		System.out.println(u1.getName());
		session.getTransaction().commit();
		session.close();
		Session session2 = sessionFactory.openSession();
		
		session2.beginTransaction();
		User u2 = (User) session2.load(User.class, 3);
		System.out.println(u2.getName());
		session2.getTransaction().commit();
		session2.close();
	}
}

 结果:

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_ from User user0_ where user0_.id=?
zhangsan
zhangsan

 

list二级缓存测试

package com.test.pojo;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;

public class UserTest {
	
	private static SessionFactory sessionFactory = null;
	@BeforeClass
	public static void beforeClass() {
		Configuration configuration = new Configuration();
		

		try {
			configuration.configure();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			
		
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
	} 
	@SuppressWarnings("unchecked")
	@Test
	public void testListEhcache() {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		List<User> users1 = (List<User>)session.createQuery("from User").setCacheable(true).list();
		for(User user : users1) {
			System.out.println(user.getName());
		}
		session.getTransaction().commit();
		session.close();
		
		Session session2 = sessionFactory.openSession();
		session2.beginTransaction();
		List<User> users2 = (List<User>)session2.createQuery("from User").setCacheable(true).list();
		for(User user : users2) {
			System.out.println(user.getName());
		}
		session2.getTransaction().commit();
		session2.close();
	}
}

 输出结果:

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from User user0_
zhangsan
zhangsan
lisi
wangwu
zhangsan
zhangsan
lisi
wangwu

 

 

  • 大小: 25.9 KB
  • 大小: 25.4 KB
  • 大小: 27.6 KB
分享到:
评论

相关推荐

    Hibernate4.1.1的Demo实例

    10. **缓存机制**:Hibernate支持二级缓存,可以通过配置实现Query缓存和Entity缓存,提高数据访问性能。例如,使用EHCache作为二级缓存提供者。 11. **Eclipse集成**:在Eclipse环境下,我们可以利用Hibernate插件...

    Hibernate5 + Mysql实现Demo源码

    Hibernate提供了一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),可提高数据访问效率。可选择第三方缓存实现,如Ehcache。 8. **示例代码** 在`Hibernate5_Demo02`中,包含了主程序、配置...

    HibernateDemo

    【标题】"HibernateDemo"是一个基于Java的开源对象关系映射框架示例,它用于简化数据库操作。这个压缩包提供了一个简单的入门项目,帮助初学者理解如何使用Hibernate框架。通过这个例子,我们可以深入学习Hibernate...

    Hibernate的Java控制台程序Demo

    **Hibernate的Java控制台程序Demo**是用于演示如何在Java应用程序中使用Hibernate框架进行对象关系映射(ORM)操作的实例。在这个项目中,我们将会深入理解Hibernate的核心概念,包括配置、实体类、持久化、会话管理...

    Hibernate简单的demo

    4. **SessionFactory**: SessionFactory是线程安全的,负责生成Session实例,通常在应用启动时初始化一次。 5. **Transaction**: Hibernate支持事务管理,Transaction对象用于包裹一组操作,确保其原子性和一致性。...

    hibernateDemo

    7. **缓存机制**:Hibernate内置了一级缓存(Session级别的)和二级缓存(SessionFactory级别的),可以提高数据访问性能。 8. **一对多(One-to-Many)、多对一(Many-to-One)、一对一(One-to-One)、多对多...

    HibernateDemo(hibernate基本用法演示)

    8. **缓存**:Hibernate 支持一级缓存(Session 缓存)和二级缓存,可以提高性能。可以通过配置决定是否启用和使用何种缓存策略。 9. **延迟加载(Lazy Loading)**:通过 `@OneToMany(mappedBy = "..." fetch = ...

    spring4搭配hibernate5和mysql的项目Demo

    以及第二级缓存支持,提升性能。在本项目中,Hibernate 5将作为Spring的JDBC抽象层,负责数据的持久化操作。 **MySQL** MySQL是一个流行的开源关系数据库管理系统,以其高性能、高可用性和易于管理著称。在本项目中...

    hibernate jsp 分页Demo

    4. **Hibernate的Criteria API或HQL(Hibernate Query Language)**: 在这个Demo中,开发者可能使用了Hibernate的Criteria API或HQL来构造动态查询,这允许根据用户输入的页码和每页记录数来定制SQL语句,从而实现...

    HibernateDemo HibernateDemo

    第二级缓存是SessionFactory级别的,可以跨Session共享数据。此外,还可以集成第三方缓存服务如Ehcache、Infinispan等。 **6. Hibernate 的事务管理** Hibernate 支持JTA(Java Transaction API)和JDBC事务管理。...

    hibernate的demo

    Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),可以提高数据访问性能。可以通过配置启用和配置缓存插件。 总结,这个"hibernate的demo"涵盖了Hibernate的基本用法,包括配置、...

    使用springmvc、hibernate、maven开发的web实例项目。

    在"springmvc_hibernate_demo"这个压缩包中,项目结构可能如下: 1. `src/main/java`:包含所有Java源代码,包括控制器(Controller)、模型(Model)、服务(Service)和DAO(数据访问对象)层的实现。 2. `src/...

    spring+hibernate框架搭建demo

    Spring是一个全面的后端开发框架,而Hibernate则是一个强大的对象关系映射(ORM)工具,两者结合可以构建出高效、灵活的企业级应用程序。下面我们将深入探讨Spring和Hibernate框架的搭建过程以及相关知识点。 首先...

    HibernateDemo.zip

    8. **第一级缓存与第二级缓存**:Hibernate提供了一级缓存(Session级别)和二级缓存(SessionFactory级别)机制,提高数据读取效率。 9. **懒加载(Lazy Loading)**:Hibernate支持延迟加载,只在真正需要时加载...

    hibernate框架demo

    3. **缓存机制**:内置二级缓存,提高数据访问效率。 4. **移植性**:由于是ORM框架,更换数据库只需修改配置,代码无需变动。 **项目结构与文件说明** 1. **.classpath**:Eclipse项目配置文件,包含项目的类路径...

    maven搭建spring4+struts2+hibernate4项目demo含数据库

    本项目"maven搭建spring4+struts2+hibernate4项目demo含数据库"是一个典型的企业级应用开发实例,它利用Maven作为构建工具,Spring 4作为核心框架,Struts2作为控制器层,Hibernate4作为持久层,同时包含了数据库的...

    android hibernate demo例子

    4. **配置文件(Hibernate Configuration)**:在Android中,配置文件可能是XML或Java配置,用于指定数据库连接信息、方言、缓存策略等。 5. **映射文件(Hibernate Mapping Files)**:.hbm.xml文件,定义了实体类...

Global site tag (gtag.js) - Google Analytics