`
tuhaitao
  • 浏览: 378751 次
  • 性别: 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

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

    Hibernate二级缓存+分页功能

    **一、Hibernate二级缓存** Hibernate一级缓存是指Session级别的缓存,它是默认开启的,每个Session都会维护一个对象缓存,用来存放该Session加载的实体对象。一级缓存的生命周期与Session相同,当Session关闭时,...

    JPA-5 使用二级缓存

    总结来说,JPA的二级缓存是一个强大的工具,能提高大数据量场景下的应用性能。但使用时需谨慎,确保数据一致性,并根据具体业务场景进行合理配置和优化。正确地利用二级缓存,将大大提高系统的响应速度,降低数据库...

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

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

    Hibernate二级缓存实例.rar

    压缩包中的"Hibernate二级缓存实例"应该包含了具体的配置文件、实体类、以及如何使用缓存的代码示例。通过学习这个实例,你可以了解到如何在项目中设置和利用Hibernate的二级缓存,从而提升应用的性能。 总结来说,...

    Hibernate二级缓存的应用

    **标题:“Hibernate二级缓存的应用”** 在Java的持久化框架Hibernate中,一级缓存是默认存在的,每个Session都有自己的缓存,而二级缓存则是可选的,它跨越了多个Session,为整个SessionFactory提供数据共享。二级...

    spring-boot-starter-data-jpa 的二级缓存

    总之,Spring Boot通过starter-data-jpa模块和Hibernate、Ehcache整合,为我们提供了一个强大的工具集,可以有效地实现二级缓存机制,优化应用性能,减少数据库压力。开发者需要掌握这些知识点,以确保在实际的项目...

    jpa框架资源基于hibernate

    4. **缓存机制**: 提供了第一级缓存和第二级缓存,提高性能。 **jar包的重要性**: 在`jpa-hibernate`这个压缩包中,包含的jar包是运行JPA基于Hibernate的应用所必需的依赖。这些库提供了JPA规范的实现以及...

    jpa之使用hibernate示例代码

    Hibernate不仅实现了JPA规范,还提供了许多额外的功能,如二级缓存、查询语言HQL和 Criteria API等,极大地简化了Java开发人员与数据库交互的工作。 在"jpa之使用hibernate示例代码"中,我们可能会涉及以下关键知识...

    JPA-Hibernate包

    Hibernate不仅实现了JPA规范,还额外提供了一些特性,如二级缓存、更灵活的查询选项和性能优化工具。 **JPA核心概念:** 1. **实体(Entity)**:在JPA中,实体是映射到数据库表的Java类。通过在类上添加`@Entity`...

    JPA和Hibernate的关系

    例如,在实体对象的状态方面,Hibernate定义了“瞬态”、“持久化”和“分离”等状态,而JPA则使用“new”、“managed”、“detached”和“removed”等术语来描述类似的概念。这些相似之处使得从Hibernate迁移到JPA...

    hibernate_ jpa.jar

    1. **缓存(Caching)**:一级缓存(Session级别的)和二级缓存(SessionFactory级别的)可以提高性能,减少对数据库的访问。 2. **批处理(Batching)**:通过设置批处理大小,可以减少数据库交互次数,提高效率。...

    JPA简述及用Hibernate实现环境

    Hibernate不仅实现了JPA规范,还添加了自己的特性,如二级缓存、 Criteria查询和HQL(Hibernate Query Language)。 **搭建JPA with Hibernate环境** 需要以下步骤: 1. **添加依赖**:在项目中引入Hibernate和JPA...

    使用JPA反向工程 Hibernate工程反向

    Hibernate不仅提供了JPA规范的所有功能,还额外提供了一些高级特性,如二级缓存、CGLIB动态代理等。在Hibernate中,反向工程(Reverse Engineering)是一种工具,可以从现有数据库生成Java类,这些类代表数据库中的...

    详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    Ehcache 是一个纯 Java 的缓存框架,既可以当做一个通用缓存使用,也可以作为 Hibernate 的二级缓存使用。缓存数据可选择如下三种存储方案: 1. MemoryStore – On-heap memory used to hold cache elements. This ...

    Hibernate's JPA.rar

    它不仅支持JPA的标准特性,还提供了额外的工具和配置选项,例如二级缓存、事件监听器、CGLIB和ASM动态代理等,使得开发者可以更高效地处理数据库操作。 **JPA的核心概念** 1. **实体(Entity)**:在JPA中,实体是...

    jpa_hibernate项目 所有jar包

    Hibernate提供了更丰富的API,可以处理更复杂的数据操作,包括事务管理、查询语言(HQL)和第二级缓存等。在JPA_Hibernate项目中,Hibernate被用作与数据库交互的主要工具。 **jar包**(Java Archive)是Java平台...

    spring3.0.5与JPA2.0(hibernate3.6)的集成详细说明

    对于复杂的应用场景,可能需要配置更多的Spring和Hibernate特性,例如二级缓存、查询缓存、拦截器等。同时,结合Spring MVC或Spring Boot等Web框架,可以构建出完整的、高度可扩展的企业级应用。 总之,Spring与JPA...

    最新配套的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...

Global site tag (gtag.js) - Google Analytics