spring data jpa 的,缓存除了用 @Cacheable、@CachePut 这些还有别的方法吗

2019-01-23 09:56:27 +08:00
 shayang888

这个貌似是二级缓存?一级缓存呢

6075 次点击
所在节点    Java
16 条回复
skypyb
2019-01-23 10:06:56 +08:00
JPA 可以集成 Redis 进行缓存啊,挺简单的
wysnylc
2019-01-23 10:30:06 +08:00
自己手动 set get 啊,spring cache 只是帮你自动缓存方法结果而已
然后这不是二级缓存,一级缓存是 sqlsession 级别,二级缓存是 Mapper 级别
二级缓存慎用
1 楼你的回答文不对题,他问缓存方法你说缓存实现
xcolder
2019-01-23 10:30:32 +08:00
可以看下 jetCache
shayang888
2019-01-23 11:18:22 +08:00
@wysnylc 那怎么去做一级缓存啊 这块有点懵逼
Kraken
2019-01-23 11:45:09 +08:00
一级缓存开不开意义不大 性能提升很小 你说的这些注解和一楼说的集成 redis 都是一个基于 JSR-107 Jcache 缓存标准的缓存 是 Spring core 实现的 和 jpa 关系不大 jpa 本身定义了一二三级缓存 一级缓存 hibernate 默认应该就是开着的 二级缓存可以用 Jcache 来实现 三级缓存现在不推荐使用了 太难用,而且用的不好的话反而会增加数据库的压力
DovaKeen
2019-01-23 11:46:10 +08:00
@shayang888 spring data jpa 的底层是 hibernate,hibernate 自己有关于 sqlsession 级别的缓存的吧,你可以找一本 hibernate 实战看看,里面有一章是讲这个的
honeycomb
2019-01-23 11:53:48 +08:00
@shayang888 spring 自身的 cachable 相当于是二级缓存,配合 springdata 用比较简单,但能直接实现的功能有限。

好处是它已经直接给适配了多种 cache 实现,从本地的到分布式的有很多选择。

比如只要用个本地+简单+性能高的缓存,可以用 caffeine
shayang888
2019-01-23 12:11:15 +08:00
@honeycomb 那一级缓存呢?我看了下网上 好像 cacheable 也是说的二级缓存
xipushi
2019-01-23 12:52:30 +08:00
private static final Map<String,Object> cache = new HashMap<>(); 这种缓存最通用,有 java 环境就可以用了。
我也没搞懂一级缓存,二级缓存。赶脚一级缓存,就是针对使用频率高的数据缓存。二级缓存,是对使用频率低的数据缓存。
Mysql 服务器针对 SQL 还有缓存,这是几级缓存?
cnxobo
2019-01-23 13:10:24 +08:00
J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的 Ehcache 缓存数据丢失。https://www.oschina.net/p/j2cache
HiJackXD
2019-01-23 13:20:18 +08:00
一级缓存关不掉的,hibernate 增删改查都会把对象放入一级缓存 session [很多人可能不知道,保存一个非持久化的对象,对象其实也会被放入 session]
shayang888
2019-01-23 14:16:06 +08:00
@HiJackXD 那我怎么知道有没有一级缓存
Belmode
2019-01-23 17:19:56 +08:00
@xipushi 这里的缓存是应用框架层的缓存,不是物理层的。SpringData JPA 默认的实现是 Hibernate,所以一级缓存是 SqlSession 级别的,这个 Hibernate 默认是开启的。 @Cacheable 注解开启的是二级缓存,它会去环境寻找其他第三方缓存接口,如果没找到,默认使用自身实现的简单 Map 来存储。
shayang888
2019-01-23 17:29:31 +08:00
@Belmode 既然一级缓存是默认开启的 为啥同一条查询语句 还是会执行多次呢
HiJackXD
2019-01-23 18:15:52 +08:00
@shayang888 #14 一级缓存会因为你 or 框架(自动)调用 session.flush()/session.clear().导致一级缓存内的对象清空,所以会执行重复语句。 所以如果你手动开启一个 session,然后在里面查询同一对象,就不会执行 sql 语句了。
HiJackXD
2019-01-23 18:20:29 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/529677

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX