这个貌似是二级缓存?一级缓存呢
1
skypyb 2019-01-23 10:06:56 +08:00
JPA 可以集成 Redis 进行缓存啊,挺简单的
|
2
wysnylc 2019-01-23 10:30:06 +08:00 1
自己手动 set get 啊,spring cache 只是帮你自动缓存方法结果而已
然后这不是二级缓存,一级缓存是 sqlsession 级别,二级缓存是 Mapper 级别 二级缓存慎用 1 楼你的回答文不对题,他问缓存方法你说缓存实现 |
3
xcolder 2019-01-23 10:30:32 +08:00
可以看下 jetCache
|
4
shayang888 OP @wysnylc 那怎么去做一级缓存啊 这块有点懵逼
|
5
Kraken 2019-01-23 11:45:09 +08:00
一级缓存开不开意义不大 性能提升很小 你说的这些注解和一楼说的集成 redis 都是一个基于 JSR-107 Jcache 缓存标准的缓存 是 Spring core 实现的 和 jpa 关系不大 jpa 本身定义了一二三级缓存 一级缓存 hibernate 默认应该就是开着的 二级缓存可以用 Jcache 来实现 三级缓存现在不推荐使用了 太难用,而且用的不好的话反而会增加数据库的压力
|
6
DovaKeen 2019-01-23 11:46:10 +08:00
@shayang888 spring data jpa 的底层是 hibernate,hibernate 自己有关于 sqlsession 级别的缓存的吧,你可以找一本 hibernate 实战看看,里面有一章是讲这个的
|
7
honeycomb 2019-01-23 11:53:48 +08:00 via Android
@shayang888 spring 自身的 cachable 相当于是二级缓存,配合 springdata 用比较简单,但能直接实现的功能有限。
好处是它已经直接给适配了多种 cache 实现,从本地的到分布式的有很多选择。 比如只要用个本地+简单+性能高的缓存,可以用 caffeine |
8
shayang888 OP @honeycomb 那一级缓存呢?我看了下网上 好像 cacheable 也是说的二级缓存
|
9
xipushi 2019-01-23 12:52:30 +08:00
private static final Map<String,Object> cache = new HashMap<>(); 这种缓存最通用,有 java 环境就可以用了。
我也没搞懂一级缓存,二级缓存。赶脚一级缓存,就是针对使用频率高的数据缓存。二级缓存,是对使用频率低的数据缓存。 Mysql 服务器针对 SQL 还有缓存,这是几级缓存? |
10
cnxobo 2019-01-23 13:10:24 +08:00 1
J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的 Ehcache 缓存数据丢失。https://www.oschina.net/p/j2cache
|
11
HiJackXD 2019-01-23 13:20:18 +08:00 via iPhone
一级缓存关不掉的,hibernate 增删改查都会把对象放入一级缓存 session [很多人可能不知道,保存一个非持久化的对象,对象其实也会被放入 session]
|
12
shayang888 OP @HiJackXD 那我怎么知道有没有一级缓存
|
13
Belmode 2019-01-23 17:19:56 +08:00 1
|
14
shayang888 OP @Belmode 既然一级缓存是默认开启的 为啥同一条查询语句 还是会执行多次呢
|
15
HiJackXD 2019-01-23 18:15:52 +08:00
@shayang888 #14 一级缓存会因为你 or 框架(自动)调用 session.flush()/session.clear().导致一级缓存内的对象清空,所以会执行重复语句。 所以如果你手动开启一个 session,然后在里面查询同一对象,就不会执行 sql 语句了。
|
16
HiJackXD 2019-01-23 18:20:29 +08:00
|