例子:
model:
@Entity
//@BatchSize(size=5)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Category {
private int id;
private String name;
@Id
@GeneratedValue
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;
}
}
测试:
package com.hibernate.test;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.hibernate.model.Category;
import com.hibernate.model.Topic;
public class HQLTest {
private static SessionFactory sf = null;
@BeforeClass
public static void beforeClass() {
// new SchemaExport(new
// AnnotationConfiguration().configure()).create(false, true);
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
@AfterClass
public static void afterClass() {
sf.close();
}
@Test
public void testSchemaExport() {
new SchemaExport(new AnnotationConfiguration().configure()).create(
false, true);
}
public static void main(String[] args) {
// new HQLTest().testSchemaExport();
HQLTest t = new HQLTest();
t.beforeClass();
t.testCache2();
}
@Test
public void testSave() {
Session session = sf.openSession();
session.beginTransaction();
for(int i=0; i<10; i++) {
Category c = new Category();
c.setName("c" + i);
Topic t = new Topic();
t.setCategory(c);
t.setTitle("t" + i);
t.setCreateDate(new Date());
session.save(c);
session.save(t);
}
session.getTransaction().commit();
session.close();
}
//一级缓存
//只会发出一条查询语句
@Test
public void testCache1() {
Session session = sf.openSession();
session.beginTransaction();
Category c = (Category)session.load(Category.class, 1);
System.out.println(c.getName());
Category c2 = (Category)session.load(Category.class, 1);
System.out.println(c2.getName());
session.getTransaction().commit();
session.close();
}
/**
* 二级缓存
* 默认情况会发两条查询语句
*
* 设置二级缓存,加入包ehcache-1.2.3.jar,在发行包中(还有另外几种二级缓存的实现厂家)
*
* 加入配置文件ehcache.xml,加入commons-logging-1.1.1.jar包
*
* 更改hibernate.hbm.xml文件
* <property name="cache.use_second_level_cache">true</property>
*<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
*<property name="cache.use_query_cache">true</property>
*
*在Category类中加入注解, @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
*
*可以了,现在利用了二级缓存,只发出一条查询语句
*/
@Test
public void testCache2() {
Session session = sf.openSession();
session.beginTransaction();
Category c = (Category)session.load(Category.class, 1);
System.out.println(c.getName());
session.getTransaction().commit();
session.close();
Session session2 = sf.openSession();
session2.beginTransaction();
Category c2 = (Category)session2.load(Category.class, 1);
System.out.println(c2.getName());
session2.getTransaction().commit();
session2.close();
}
/**
* 查询缓存,查询条件一样
* 设置.setCacheable(true)
*/
@Test
public void testQueryCache3() {
Session session = sf.openSession();
session.beginTransaction();
List<Category> categories = (List<Category>)session.createQuery("from Category")
.setCacheable(true).list();
session.getTransaction().commit();
session.close();
Session session2 = sf.openSession();
session2.beginTransaction();
List<Category> categories2 = (List<Category>)session2.createQuery("from Category")
.setCacheable(true).list();
session2.getTransaction().commit();
session2.close();
}
}
缓存策略提供商(Cache Providers)
Cache
Provider class
Type
Cluster Safe
Query Cache Supported
Hashtable (not intended for production use) |
org.hibernate.cache.HashtableCacheProvider |
memory |
|
yes |
EHCache |
org.hibernate.cache.EhCacheProvider |
memory, disk |
|
yes |
OSCache |
org.hibernate.cache.OSCacheProvider |
memory, disk |
|
yes |
SwarmCache |
org.hibernate.cache.SwarmCacheProvider |
clustered (ip multicast) |
yes (clustered invalidation) |
|
JBoss Cache 1.x |
org.hibernate.cache.TreeCacheProvider |
clustered (ip multicast), transactional |
yes (replication) |
yes (clock sync req.) |
JBoss Cache 2 |
org.hibernate.cache.jbc2.JBossCacheRegionFactory |
clustered (ip multicast), transactional |
yes (replication or invalidation) |
yes (clock sync req.) |
分享到:
相关推荐
此外,`hibernate-configuration-3.0.dtd`还定义了如何设置JNDI数据源,以及如何启用二进制日志、SQL查询统计等功能。 接下来,我们转向`hibernate-mapping-3.0.dtd`。这个文件定义了Hibernate映射文件的语法规则,...
本篇文章将深入探讨Hibernate的二级缓存机制,以及如何进行一级缓存与二级缓存的同步,同时还会介绍二级缓存的配置文件设置。 一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象...
**hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...
在IT行业中,二级缓存是一种优化数据库访问性能的重要技术,特别是在使用ORM框架(如Hibernate)、权限管理框架(如Shiro)以及SQL映射框架(如MyBatis)时。二级缓存可以存储经常访问的数据,避免频繁地从数据库中...
- 使用二级缓存提高性能,如EhCache集成。 - 合理设计实体关系,避免N+1查询问题。 - 使用批处理更新和插入,减少数据库交互次数。 通过以上分析,我们可以看出`hibernate-core-5.0.11.Final.jar`在ORM中的重要地位...
Hibernate内置了两级缓存:一级缓存是Session级别的,每个Session都有自己的缓存,存储最近操作的对象;二级缓存可配置为进程级或集群级,用于存储经常访问的数据,提高性能。另外,Hibernate还支持第三方缓存系统如...
本篇主要关注的是Hibernate的二级缓存,这是一个提高应用性能的关键特性。 一级缓存是Hibernate内置的Session缓存,每个Session都有自己的缓存,用于存储实体对象,它可以避免频繁地与数据库进行交互,提高性能。...
同时,Hibernate还支持第二级缓存,可以提高数据读取速度。此外,其强大的查询语言HQL和Criteria API提供了灵活的数据检索方式。 总之,`hibernate-release-5.0.7.Final`版本的jar包集合是Java开发者进行ORM编程的...
总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...
本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...
6. **缓存**:Hibernate内置了二级缓存机制,可以通过配置使用如Ehcache这样的缓存提供者,提高性能。 7. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@...
【标题】"hibernate-release-4.1.4" 是Hibernate...通过深入研究这个压缩包,开发者不仅可以了解Hibernate的基本用法,还能掌握更高级的功能,如事务管理、缓存策略、查询语言(HQL)等,从而提升开发效率和代码质量。
本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级缓存 一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们...
**hibernate-memcached包** 是一个专为Hibernate框架设计的扩展,目的是将流行的分布式内存缓存系统Memcached整合到Hibernate中,作为其二级缓存解决方案。在大型分布式应用中,缓存技术是提高性能的关键,特别是...
通常,一级缓存由Hibernate Session管理,而二级缓存则可以跨越多个Session进行共享。 在Spring Boot项目中配置Redis作为Hibernate的二级缓存,我们需要以下步骤: 1. **添加依赖**: 首先,在`pom.xml`文件中...
9. **缓存机制**:Hibernate有两层缓存,第一层是Session级别的缓存,称为一级缓存;第二层是可选的,可以配置为使用第三方缓存服务,如Ehcache,称为二级缓存。缓存可以显著提升数据访问速度。 10. **事件和监听器...
- **Session**:是操作数据库的入口,提供了一种基于对象的操作方式,支持CRUD操作,并具有事务管理和二级缓存功能。 4. **映射机制**: - **XML 映射文件**:如hibernate.hbm.xml,定义了Java类与数据库表之间的...
本文将详述如何在项目中使用Hibernate与Memcached结合实现二级缓存,并探讨Memcached的基本原理和使用方法。 首先,我们需要理解什么是Hibernate的二级缓存。在Hibernate框架中,一级缓存是每个Session级别的,它...
-- 查询的二级缓存配置 --> <property name="hibernate.cache.use_query_cache">true</property> <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 4.0配置如下: ...
Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...