一级缓存:

会话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介绍的更多相关文章

  1. Spring Boot2 系列教程 (七) | 使用 Spring Data JPA 访问 Mysql

    前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spring Data JPA 之前,首先介绍 Hibernate . Hibernat ...

  2. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL

    在数据访问这章的第一篇文章<Spring中使用JdbcTemplate访问数据库> 中,我们已经介绍了如何使用Spring Boot中最基本的jdbc模块来实现关系型数据库的数据读写操作. ...

  3. Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!

    前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...

  4. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

  5. Spring Data JPA介绍与简单案例

    一.Spring Data JPA介绍 可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL(Java Persistence Query Languag ...

  6. springboot:spring data jpa介绍

    转载自:https://www.cnblogs.com/ityouknow/p/5891443.html 在上篇文章springboot(二):web综合开发中简单介绍了一下spring data j ...

  7. spring boot(五)Spring data jpa介绍

    在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...

  8. Spring Data JPA 介绍

    Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在 ...

  9. Spring整合Hibernate实现Spring Data JPA (介绍和使用)

    Spring Data JPA是Spring基于Hibernate开发的一个JPA框架.如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便. 但是Sprin ...

随机推荐

  1. mysql主从同步错误,提示The server quit without updating PID file

    在安装完lnmp后,启动mysqld失败,提示 [root@centos-6 ~]# service mysqld start Starting MySQL [确定][root@centos-6 ~] ...

  2. Laravel 集成 JPush 极光推送指北

    我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就不用看了). Laravel 使用 Composer 来管理代码依赖.所以 ...

  3. Mac 更改/usr/bin 目录权限失败

    对于Mac OS X 10.11 El Capitan用户,由于系统启用了SIP(System Integrity Protection), 导致root用户也没有权限修改/usr/bin目录.按如下 ...

  4. luogu4074 [WC2013]糖果公园(树上带修莫队)

    link 题目大意:给一个树,树上每个点都有一种颜色,每个颜色都有一个收益 每次修改一个点上的颜色 或询问一条链上所有颜色第i次遇到颜色j可以获得w[i]*v[j]的价值,求链上价值和 题解:树上带修 ...

  5. JavaScript DOM编程艺术 笔记(一)

    探测浏览器品牌版本代码-----浏览器嗅探 代码 JavaScript==ECMAScript java几乎可以部署在任何环境,js只应用于web浏览器 API是一组得到各方面共同认同的基本约定(元素 ...

  6. 为什么我会选择走 Java 这条路?

    阅读本文大概需要 2.8 分钟.   作者:黄小斜 文章来源:微信公众号[程序员江湖] 最近有一些小伙伴问我,为什么当初选择走Java这条路,为什么不做C++.前端之类的方向呢,另外还有一些声音:研究 ...

  7. HTML中title前面小图标和网站收藏现实的图标

    网站上的logo实际上是一个“favicon.ico”图片.实现步骤:第一步:制作favicon.ico,大小为16*16毫米:第二步:将“favicon.ico”放到项目的根路径下. 第三步:在所有 ...

  8. UML-6.2-用例-用例模型/用例/场景关系

    参与者:具有某些行为的人或事物.如上一章中的收银员. |_主要参与者:收银员. |_协助参与者:程序(自动付费.帮收银员验证输入要素) |_幕后参与者:政府等(电子签章取证找公证机构) 用例:一组相关 ...

  9. ptyhon技能树及其学习资源

    GUI编程 tkinter Github项目 Tkinter by example effbot 文档 tkinter的一个designer,可以像在qtdesign那样创建UI文件 pyqt5 py ...

  10. window.load方法 (加载全部图片,第三方网站时使用)

    $(window).load(  function(){                                                              console.lo ...