Spring Data JPA 缓存结合Ehcache介绍
一级缓存:
会话session、事务级别的,事务退出,缓存就失效了。
实体管理器在事务执行期间持有一份数据的拷贝,而非直接操作数据源。
二级缓存:
进程范围级或集群范围的缓存,这个级别的缓存可配置和修改,整个应用程序的生命周期内都可以访问。
由于多个事务会同时访问二级缓存中相同的数据,因此二级缓存必须提供必要的并发访问策略
以id为标识放到缓存(针对id)
访问过程:先一级缓存、后二级缓存,再数据源
桥接第三方缓存,hibernate二级缓存的实现:
1.ehcache
2.OScache
3.JBossCache
4.Memcached
......
什么样的数据适合二级缓存呢?
1.很少被修改的数据
2.不是很重要,允许偶尔出现并发的数据
3.不会被高并发访问的数据
4.参数数据,通常是数量有限,极少被修改,大量的被其它实例引用的
不适合使用二级缓存?
1.经常被修改的数据,代价太大,得不偿失
2.金钱敏感的数据,绝对不允许出现并发
3.与其他应用共享的数据
查询缓存:
批量的缓存、批量的获取,如按查询条件、查询结果进行缓存;
JPA+Ehcache缓存配置:
1.加入Ehcache依赖
- <!--Ehcache-core 包 -->
- <dependency>
- <groupId>net.sf.ehcache</groupId>
- <artifactId>ehcache-core</artifactId>
- <version>2.6.9</version>
- </dependency>
- <!--添加Hibernate-Ehcache包 -->
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-ehcache</artifactId>
- <version>${hibernate-version}</version>
- </dependency>
2.配置ehcache.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
- <diskStore path="java.io.tmpdir/ehcache"/>
- <!-- 默认缓存 -->
- <defaultCache
- maxElementsInMemory="1000" <!-- 默认缓存中存最多数据项目 -->
- eternal="false" <!--是否永不过期-->
- timeToIdleSeconds="120" <!--空闲多长时间后从缓存中删除-->
- timeToLiveSeconds="120" <!--活跃多长时间后从缓存中删除-->
- overflowToDisk="false"/><!--超过maxElementsInMemory之后是否存储到硬盘-->
- <!-- 题目缓存-->
- <cache name="questionCache"
- maxElementsInMemory="1000"
- eternal="true"
- timeToIdleSeconds="120"
- timeToLiveSeconds="120"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU" <!--数据项失效策略-->
- />
- </ehcache>
3.persistence.xml配置加入缓存配置
- entry key="hibernate.cache.use_second_level_cache" value="false" /><!--开启二级缓存-->
<entry key="hibernate.cache.use_query_cache" value="false" /><!--开启查询缓存-->- <entry key="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/> <!--ehcache支持-->
<entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" /><!--ehcache支持-->
<entry key="hibernate.cache.provider_configuration" value="classpath:ehcache.xml"/><!--ehcache详细配置-->
4.配置需二级缓存实体和属性
在实体类和实体的那些集合属性上启用二级缓存使用
- @Entity
- @Table(name = "user")
- @Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="指定的cache")
- @Cacheable(true)
- public class User implements java.io.Serializable {
- private static final long serialVersionUID = 6980093847795726310L;
- private String id;
- private String userName;
- private String password;
- private Set<Role> roles = new HashSet<Role>();
- ....省略
- /**
- *注:如果一个实体需要二级缓存,若该实体含有<set...>,<list...>等属性时,也必须要指定缓存策略。
- */
- @ManyToMany(fetch = FetchType.LAZY)
- @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
- @JoinTable(name = "user_role", joinColumns = { @JoinColumn(name = "user_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "role_id", nullable = false, updatable = false) })
- public Set<Role> getRoles() {
- return this.roles;
- }
- public void setRoles(Set<Role> roles) {
- this.roles = roles;
- }
- }
Usage提供缓存对象的事务隔离机制有如下几种:
(NONE, READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL)
ehcache不支持transaction事务机制,但其他三种可以使用:
read-only::
无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,
但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。
read-write:
需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level(序列化事务隔离级别)
nonstrice-read-write:
只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存策略。
5.配置查询缓存
a.通过添加@QueryHints来实现查询缓存
- public interface DictDao extends JpaRepository<Dict, Integer>,JpaSpecificationExecutor<Dict>{
- // spring-data-jpa默认继承实现的一些方法,实现类为SimpleJpaRepository。
- // 该类中的方法不能通过@QueryHint来实现查询缓存。
- @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })
- List<Dict> findAll();
- @Query("from Dict")
- @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })
- List<Dict> findAllCached();
- @Query("select t from Dict t where t.name = ?1")
- @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })
- Dict findDictByName(String name);
- }
b.自定义Repository扩展接口内使用查询缓存
- public class UserReposiotryImpl {
- @PersistenceContext
- private EntityManager em;
- /**
- * 使用查询缓存,调用setHint方法配置.
- */
- public User findByCustomizeId() {
- return (User) em.createQuery("from User p where p.id=1")
- .setHint("org.hibernate.cacheable", true).getSingleResult();
- }
Spring Data JPA 缓存结合Ehcache介绍的更多相关文章
- Spring Boot2 系列教程 (七) | 使用 Spring Data JPA 访问 Mysql
前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spring Data JPA 之前,首先介绍 Hibernate . Hibernat ...
- Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL
在数据访问这章的第一篇文章<Spring中使用JdbcTemplate访问数据库> 中,我们已经介绍了如何使用Spring Boot中最基本的jdbc模块来实现关系型数据库的数据读写操作. ...
- Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!
前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...
- JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!
序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...
- Spring Data JPA介绍与简单案例
一.Spring Data JPA介绍 可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL(Java Persistence Query Languag ...
- springboot:spring data jpa介绍
转载自:https://www.cnblogs.com/ityouknow/p/5891443.html 在上篇文章springboot(二):web综合开发中简单介绍了一下spring data j ...
- spring boot(五)Spring data jpa介绍
在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...
- Spring Data JPA 介绍
Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在 ...
- Spring整合Hibernate实现Spring Data JPA (介绍和使用)
Spring Data JPA是Spring基于Hibernate开发的一个JPA框架.如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便. 但是Sprin ...
随机推荐
- docker搭建elk+cerebro环境
ELK的帮助手册 Docker Hub官网:https://hub.docker.com/r/sebp/elk/ Docker ELK使用文档:http://elk-docker.readthedoc ...
- ES6(二) 函数
箭头函数 是简写,不要function 1.如果有且仅有一个参数,()可以不写 2.如果有且仅有一条语句,而且是return,{}也可以不写 let arr=[12,23,5,6] // arr.so ...
- 键盘压缩背景,ios滚动不流畅,禁止遮罩层下面内容滚动
1.<!--防止软键盘压缩页面背景图片--> <script> const bodyHeight = document.documentElement.clientHeight ...
- python学习,day3:函数式编程
调用函数来实现文件的修改(abc.txt),并增加上时间,调用的是time模块, 需要注意的是,每个函数一定要用‘’‘ ‘’’ 标注下函数说明 # coding=utf-8 # Author: RyA ...
- [转] Gitlab 8.x runner安装与配置
[From]http://muchstudy.com/2018/07/13/Gitlab-8-x-runner%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE ...
- Windbg双机调试环境配置(Windows7/Windows XP+VirtualBox/VMware+WDK7600)
简介:Windbg双机调试内核.驱动 下载软件: 下载Windbg(GRMWDK_EN_7600_1.ISO) 下载VirtualBox 5.2/VMware 12 一.安装WDK,这里要提一点的是D ...
- git泄露利用脚本
留一下万一之后用得着呢 工作原理 1.解析.git/index文件,找到工程中所有的: ( 文件名,文件sha1 ) 2.去.git/objects/ 文件夹下下载对应的文件 3.zlib解压文件,按 ...
- 推荐-Everything搜索工具
简介: windows操作系统下极其强大的文件搜索工具. 下载: https://www.voidtools.com/downloads/ 推荐理由: 速度之快难以想象,日常工作必备工具之一. 发现的 ...
- 服务端模拟http服务请求客户端
try { InputStream in = req.getInputStream(); int i = -1; ByteArrayOutputStream out = new ByteArrayOu ...
- Springboot集成WebSocket通信全部代码,即扣即用。
websocket通信主要来自两个类以及一个测试的html页面. MyHandler 和 WebSocketH5Config,下面全部代码 MyHandler类全部代码: package com.un ...