hibernate注解方式的二级缓存

简介: hibernate默认情况下是支持一级缓存,也就是session级的缓存的,而默认情况下是不支持二级缓存,即sessionFactory级的缓存的,二级缓存        一般比较少去考虑它,除非对效率要求非常高的时候, 这时侯如果我们的某一个实体要在多个session里面使用需要用到s...

hibernate默认情况下是支持一级缓存,也就是session级的缓存的,而默认情况下是不支持二级缓存,即sessionFactory级的缓存的,二级缓存        一般比较少去考虑它,除非对效率要求非常高的时候,
这时侯如果我们的某一个实体要在多个session里面使用需要用到session间的缓存的时候就可以进行配置来实现二级缓存了!

在看文档的时候说可以在persistence.xml里面进行配置,但我一般是不用这个文件的,就直接使用注解!

在使用二级缓存之前需要先开启二级缓存的功能,否则不能使用;

具体做法是在hibernate的配置文件里面加上

<property name="cache.use_second_level_cache">true</property>
  <property name="cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>

此外还需要导入ehcache.jar包

一般就是如果哪个类需要使用到二级缓存就在该类上加上注解@cacheable,这就表明该类是支持二级缓存的,此外,还可以通过@cache注解来选择缓存策略,缓存策略主要有四种,分别是:

  • read-only

  • read-write

  • nonstrict-read-write

  • transactional

用法类似于这样:

@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
<!-- -->
此外@cache注解还可以用于包含其他实体类的集合类属性,这样该集合也会缓存起来!

 

示例:

//实体类@cacheable
@Entity @Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Forest { ... }

//集合类@cache
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="CUST_ID")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public SortedSet<Ticket> getTickets() {
    return tickets;
}

 

 

 测试:

@Test
	public void testFind() {//Model1是使用了二级缓存的,这里只会发出一条sql语句
		Session session = factory.openSession();
		Model1 model = (Model1)session.get(Model1.class, 1);
		
		System.out.println(model.getId());
		Session session2 = factory.openSession();
		Model1 model2 = (Model1)session2.get(Model1.class, 1);
		System.out.println(model2.getId());
		
		session.close();
		session2.close();
	}
	
	@Test
	public void testFind2() {//Model2没有进行二级缓存,所以这里会发出两条sql语句
		Session session = factory.openSession();
		Model2 model = (Model2)session.get(Model2.class, 1);
		
		System.out.println(model.getId());
		Session session2 = factory.openSession();
		Model2 model2 = (Model2)session2.get(Model2.class, 1);
		System.out.println(model2.getId());
		
		session.close();
		session2.close();
	}


@Cache用于集合类属性:

@Test
	public void testFind4() {
		//在没有给Model1里面的models加上二级缓存的注解@Cache之前,
		//不同的Session里面的同一个对象使用models的时候会发出多条sql语句
		//而加上了@Cache之后,下面只会发出一条SQL语句
		Session session = factory.openSession();
		Model1 model = (Model1)session.get(Model1.class, 1);
		List<Model2> models = model.getModels();
		for (Model2 mode2: models) {
			System.out.println(mode2.getId());
		}
		Session session2 = factory.openSession();
		Model1 model1 = (Model1)session2.get(Model1.class, 1);
		List<Model2> models2 = model1.getModels();
		for (Model2 model2: models2) {
			System.out.println(model2.getId());
		}
		session.close();
		session2.close();
	}
 
@OneToMany(mappedBy="model1")
	@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
	public List<Model2> getModels() {
		return models;
	}
 

 

目录
相关文章
|
4月前
|
缓存 NoSQL Redis
通过切面结合Redis自定义缓存注解
通过切面结合Redis自定义缓存注解
56 0
|
17天前
|
缓存 NoSQL Java
揭秘性能提升的超级武器:掌握Hibernate二级缓存策略!
【9月更文挑战第3天】在软件开发中,性能优化至关重要。使用Hibernate进行数据持久化的应用可通过二级缓存提升数据访问速度。一级缓存随Session生命周期变化,而二级缓存是SessionFactory级别的全局缓存,能显著减少数据库访问次数,提高性能。要启用二级缓存,需在映射文件或实体类上添加相应配置。然而,并非所有场景都适合使用二级缓存,需根据业务需求和数据变更频率决定。此外,还可与EhCache、Redis等第三方缓存集成,进一步增强缓存效果。合理运用二级缓存策略,有助于大幅提升应用性能。
35 5
|
1月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
32 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
20天前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
23 0
|
30天前
|
缓存 Java 数据库连接
Hibernate 中的查询缓存是什么?
【8月更文挑战第21天】
22 0
|
30天前
|
存储 缓存 Java
|
30天前
|
存储 缓存 Java
Hibernate 中默认启用二级缓存吗?
【8月更文挑战第21天】
27 0
|
30天前
|
存储 缓存 Java
Hibernate 中的二级缓存是什么?
【8月更文挑战第21天】
24 0
|
30天前
|
缓存 Java 数据库连接
Hibernate 中的一级缓存是什么?
【8月更文挑战第21天】
29 0
|
30天前
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中数据的问题如何解决