`
tuhaitao
  • 浏览: 375793 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JPA环境下使用Hibernate二级缓存

阅读更多
hibernate二级缓存本质上分为两类:
1.对象缓存
2.查询缓存

在JPA环境下,例如Jboss,底层还是通过Hibernate来实现JPA的Query。

下边简单说一下配置的步骤:

1.配置entity
在实体上方加入@Cache
import java.io.Serializable;

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

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

@Entity
@Table
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User implements Serializable {
	private static final long serialVersionUID = -5121812640999313420L;

	private Integer id;
	
	private String name;

	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

CacheConcurrencyStrategy有几种,大家自己查下相关资料,按需要配置就可以了,我这里不需要事务支持.
需要注意的是,@Cache这个注解在很多jar包里都有,注意我上边写的import.

2.配置EJB/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
	<!-- Persistence deployment descriptor for dev profile -->
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">

	<persistence-unit name="cachedb">
		<jta-data-source>java:/cachedb</jta-data-source>
		<properties>
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.cache.use_second_level_cache" value="true" />
			<property name="hibernate.cache.use_structured_entries" value ="true" />
			<property name="hibernate.cache.use_query_cache" value="true" />
			<property name="hibernate.cache.provider_class" value="com.googlecode.hibernate.memcached.MemcachedCacheProvider" />
			<property name="hibernate.memcached.servers" value="localhost:11211" />
			<property name="hibernate.memcached.cacheTimeSeconds" value="300" />
		</properties>
	</persistence-unit>

</persistence>

这里我使用了memcached,还有Ehcache、OSchache、或者TreeCache等,主要需配置:
hibernate.cache.use_second_level_cache = true
hibernate.cache.use_query_cache = true
与相应的hibernate.cache.provider_class

3.在程序中使用查询缓存
    首先大家需要明确JPA对缓存的规范还没有形成,但JPA实现的厂家都会用hibernate来做JPA的实现,所以通常的方法是将JPA的Query转换成Hibernate的Query,大家用过Hibernate都知道,Hibernate里的Query有个setCacheable(true/false)的方法,这里是设置查询是否进入二级缓存的.
    这里需要强调一下,默认的如果不在程序中显示的执行查询缓存声明操作,hibernate是不会对查询的list进行缓存的,默认的在开启hibernate二级缓存时,hibernate只缓存,根据主键id查找的对象,jpa下是find(id, clazz)方法.

下边是转换的代码:为了区分JPA的Query与Hibernate的Query,我写上了全名
public List<User> listUser() {
javax.persistence.Query query = em.createQuery("from User u where u.id>:id", User.class);
query.setParameter("id", 5);
org.hibernate.ejb.QueryImpl hs = null;
org.hibernate.Query hbQuery = null;
List<User> list = null;
if(query instanceof org.hibernate.ejb.QueryImpl) {
	hs = (org.hibernate.ejb.QueryImpl)query;
	hbQuery = hs.getHibernateQuery();
	hbQuery.setCacheable(true);//设置使用二级缓存
	list = hbQuery.list();
} else {
	list = query.getResultList();
}
return list;
}


这里再说一下使用经验,这样的转换不光是对createQuery方法,还能对createNamedQuery,甚至是createNativeQuery,都可以缓存查询结果.

只是一点使用经验,跟大家分享一下:)


2
0
分享到:
评论
4 楼 jfk1983 2011-12-21  
我怎么就不行呢
3 楼 nforce_com 2011-04-01  
2 楼 tuhaitao 2011-01-14  
tuhaitao 写道
herowj 写道
接口能这样转换吗?hibernate的Query接口跟JPA中的Query接口毫无关系,你的if类型判断永远不会执行吧。

在hibernate-entitymanager.jar包中,存在如下的代碼:


package org.hibernate.ejb;

public class QueryImpl implements javax.persistence.Query, HibernateQuery



你用entityManager.createQuery() 出來的,會是上邊這個實現.

1 楼 herowj 2011-01-11  
接口能这样转换吗?hibernate的Query接口跟JPA中的Query接口毫无关系,你的if类型判断永远不会执行吧。

相关推荐

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

    基于springboot最新版本2.1.4.RELEASE,采用jpa为dao层框架,配置redis(redisson)为hibernate的二级缓存。

    最新配套的hibernate包,日志为log4j,hibernate二级缓存包等

    commons-logging-1.1.1.jar,dom4j-1.6.1.jar,ehcache-1.5.0.jar,hibernate3.jar,hibernate-jpa-2.0-api-1.0.0.Final.jar,javassist-3.12.0.GA.jar,jta-1.1.jar,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar...

    secondlc:使用 Infinispan 作为缓存提供者的 HibernateJPA 二级缓存演示(独立、托管、集群)

    运行 QueryWith2lcBenchmark/FindWith2lcBenchmark: -Djub.consumers=CONSOLE,H2 -Djub.db.file=.benchmarks 要添加 Byteman,请添加: -javaagent:/opt/byteman/lib/byteman.jar=listener:true,boot:/opt/byteman/...

    Spring3.2_Hibernate4.2_JPA2全注解实例

    Spring3.2 Hibernate4.2 JPA2全注解实例.采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。

    Struts2 + Spring3 + Hibernate3.5 整合(集成测试配套jar包更新构建脚本使用说明)

    此项目整合了目前主流和最前源的web开发技术:采用ehcache实现二级缓存(包含查询缓存);用sf4j及logback(log4j的升级版)记录日志;proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿...

    DWR3.0_Spring3.2_Hibernate4.2_JPA全注解实例

    DWR3.0 Spring3.2 Hibernate4.2 JPA全注解实例。采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。.

    Hibernate_JPA

    关于Hibernate的基本知识,有关关联映射,二级缓存,一对多,多对一,HQL查询等等.

    Hibernate实战(第2版 中文高清版)

     13.4.5 控制二级高速缓存   13.5 小结   第14章 利用HQL和JPA QL查询   14.1 创建和运行查询   14.1.1 准备查询   14.1.2 执行查询   14.1.3 使用具名查询   14.2 基本的HQL和JPA QL查询   14.2.1...

    zxframe的demo

    支持多层次缓存:本地一级缓存,本地全局二级缓存,远程缓存,查询缓存,方法级别缓存 *.支持缓存融入事务,业务异常不提交缓存数据 *.支持防缓存穿透,防缓存击穿,防缓存雪崩 *.支持DB多数据源:分库分表,读写...

    zxframe demo.rar

    支持多层次缓存:本地一级缓存,本地全局二级缓存,远程缓存,查询缓存,方法级别缓存 *.支持缓存融入事务,业务异常不提交缓存数据 *.支持通用分布式锁 *.支持全服务热更新配置 *.支持服务运行状态和日志查询,便于...

    spring2.5学习PPT 传智博客

    spring2.5学习PPT 传智...为Spring集成的Hibernate配置二级缓存 30.Spring提供的CharacterEncoding和OpenSessionInView功能 31.使用Spring集成JPA 32.Struts+Spring+JPA集成 33.使用Spring集成Struts2 34.所有源码

    jpa2.0(JSR-317) 规范 包含javadoc

    该草案获得JSR-317专家组全部通过 新增了大量的特性包括类型安全的动态查询(Criteria API );...标准的二级缓存,标准的 JDBC properties ,指定超时时间等等; 目前hibernate 3.5 已经提供了jpa2.0的全部实现;

    hibernate-demos:各种Hibernate项目演示的存储库

    来自单个Hibernate实例的多个并发数据库和客户端核心/缓存:实体二级缓存(2LC)和查询缓存核心/扩展:历史/审计数据核心/空间:地理数据osgi :教程演示所有可能的ORM OSGi配置HibernateOGM 远足演示:用于在2014年...

    finance-master汇尚电子商务商品管理系统.zip

    二级小分类 品牌表 地区表 品牌月行汇总表 品牌月列汇总表 汇总行合计表 汇总列合计表 财务费用类别表 财务费用类别二级小类 店铺消费金额明细表 店铺消费金额主表 原始文件记录表 导入文件日志表 商品决策系统: ...

    Spring in Action(第2版)中文版

    5.4.4使用hibernate3上下文会话 5.5spring和java持久api 5.5.1使用jpa模板 5.5.2创建一个实体管理器工厂 5.5.3建立使用jpa的dao 5.6spring和ibatis 5.6.1配置ibatis客户模板 5.6.2建立基于ibatis的dao 5.7...

    Spring in Action(第二版 中文高清版).part2

    5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS...

    Spring in Action(第二版 中文高清版).part1

    5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS...

    java面试题库2021.pdf

    ④二级缓存与查询缓存 3、 Struts ①MVC 模式与 Struts 体系 4、 mybatis 5、 MVC 框架 6、 各框架对比与项目优化 7、 JPA ①EJB 三、 Java web 开发核心内容 1、 web 编程基础 ①Tomcat 服务器NOWCODER.COM 牛客网...

    CMS轻量级系统

    1、天梯是一款使用Java编写的免费的轻量级CMS系统,目前提供了从后台管理到前端展现的整体解决方案。 2、用户可以不编写一句代码,就制作出一个默认风格的CMS站点。 3、前端页面自适应,支持PC和H5端,采用前后端...

Global site tag (gtag.js) - Google Analytics