jpa_缓存

Posted cxqbk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jpa_缓存相关的知识,希望对你有一定的参考价值。

查询缓存

https://blog.csdn.net/qq_24084925/article/details/51890194

如果想要使用缓存,只查询一次,可以使用setHint

Query query = entityManager.createQuery(jpql).setHint(QueryHints.HINT_CACHEABLE, true);

注意:这里的QueryHints是org.hibernate.ejb.QueryHints包下的,并且,使用查询缓存的前提是在配置文件中配置了启用查询缓存

<property name="hibernate.cache.use_query_cache" value="true"/>


使用二级缓存

https://blog.csdn.net/abc997995674/article/details/80236865 

一级缓存
一级缓存是session级别的缓存,在JPA中一个entityManager对应一个session,一个session就对应一个缓存。

查询两次id为1的user

User user1 = entityManager.find(User.class, 1);
User user2 = entityManager.find(User.class, 1);
1
2
结果发现只调用了一次sql查询,因为使用了一级缓存,当第一次find就把查询到的数据放入到还缓存中,第二次再查会先去缓存中找,如果有就直接使用而不用重新查询。

技术图片

 

 

如果查询一次后,关掉entityManager,再查询

User user1 = entityManager.find(User.class, 1);
entityManager.close();
entityManager = factory.createEntityManager();
User user2 = entityManager.find(User.class, 1);
1
2
3
4
发现查询了两次,因为entityManager关闭之后,其对应的缓存也就没有了。
然后有重新开启一个entityManager,就和之前的不是同一个了。

 

 

jpa--8.api(EntityTransaction)

https://blog.csdn.net/qq_26553781/article/details/79721530

1.1  概念

EntityTransaction接口用来管理资源层实体管理器的事务操作。通过调用实体管理器的getTransaction方法获得其实例。

1.2  方法

• begin ()

用于启动一个事务,此后的多个数据库操作将作为整体被提交或撤消。若这时事务已启动则会抛出 IllegalStateException 异常。

• commit ()

用于提交当前事务。即将事务启动以后的所有数据库更新操作持久化至数据库中。

• rollback ()

撤消(回滚)当前事务。即撤消事务启动后的所有数据库更新操作,从而不对数据库产生影响。

• setRollbackOnly ()

使当前事务只能被撤消。

• getRollbackOnly ()

查看当前事务是否设置了只能撤消标志。

1.3  参考

技术图片

 

以上是关于jpa_缓存的主要内容,如果未能解决你的问题,请参考以下文章

jpa缓存导致无法查询到更新后的数据&android出现ANR的一个解决办法

spring-data-jpa+hibernate 各种缓存的配置演示

JPA:仅当结果集不为空时才缓存查询

jpa 遇到问题,当被告知忽略时,看起来是从缓存中读取

Android获取各个应用程序的缓存文件代码小片段(使用AIDL)

WildFly 中的 JPA 共享缓存/二级缓存