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;
	}
 

 

目录
相关文章
|
12天前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
41 5
|
15天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
56 2
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
58 2
|
2月前
|
缓存 NoSQL Java
揭秘性能提升的超级武器:掌握Hibernate二级缓存策略!
【9月更文挑战第3天】在软件开发中,性能优化至关重要。使用Hibernate进行数据持久化的应用可通过二级缓存提升数据访问速度。一级缓存随Session生命周期变化,而二级缓存是SessionFactory级别的全局缓存,能显著减少数据库访问次数,提高性能。要启用二级缓存,需在映射文件或实体类上添加相应配置。然而,并非所有场景都适合使用二级缓存,需根据业务需求和数据变更频率决定。此外,还可与EhCache、Redis等第三方缓存集成,进一步增强缓存效果。合理运用二级缓存策略,有助于大幅提升应用性能。
84 5
|
3月前
|
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框架。
88 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
3月前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
44 0
|
3月前
|
缓存 Java 数据库连接
Hibernate 中的查询缓存是什么?
【8月更文挑战第21天】
37 0
|
3月前
|
存储 缓存 Java
|
3月前
|
存储 缓存 Java
Hibernate 中默认启用二级缓存吗?
【8月更文挑战第21天】
35 0
|
3月前
|
存储 缓存 Java
Hibernate 中的二级缓存是什么?
【8月更文挑战第21天】
37 0