V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shayang888
V2EX  ›  Java

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

  •  
  •   shayang888 · 2019-01-23 09:56:27 +08:00 · 6062 次点击
    这是一个创建于 1913 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    比如只要用个本地+简单+性能高的缓存,可以用 caffeine
    shayang888
        8
    shayang888  
    OP
       2019-01-23 12:11:15 +08:00
    @honeycomb 那一级缓存呢?我看了下网上 好像 cacheable 也是说的二级缓存
    xipushi
        9
    xipushi  
       2019-01-23 12:52:30 +08:00
    private static final Map<String,Object> cache = new HashMap<>(); 这种缓存最通用,有 java 环境就可以用了。
    我也没搞懂一级缓存,二级缓存。赶脚一级缓存,就是针对使用频率高的数据缓存。二级缓存,是对使用频率低的数据缓存。
    Mysql 服务器针对 SQL 还有缓存,这是几级缓存?
    cnxobo
        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
    HiJackXD
        11
    HiJackXD  
       2019-01-23 13:20:18 +08:00 via iPhone
    一级缓存关不掉的,hibernate 增删改查都会把对象放入一级缓存 session [很多人可能不知道,保存一个非持久化的对象,对象其实也会被放入 session]
    shayang888
        12
    shayang888  
    OP
       2019-01-23 14:16:06 +08:00
    @HiJackXD 那我怎么知道有没有一级缓存
    Belmode
        13
    Belmode  
       2019-01-23 17:19:56 +08:00   ❤️ 1
    @xipushi 这里的缓存是应用框架层的缓存,不是物理层的。SpringData JPA 默认的实现是 Hibernate,所以一级缓存是 SqlSession 级别的,这个 Hibernate 默认是开启的。 @Cacheable 注解开启的是二级缓存,它会去环境寻找其他第三方缓存接口,如果没找到,默认使用自身实现的简单 Map 来存储。
    shayang888
        14
    shayang888  
    OP
       2019-01-23 17:29:31 +08:00
    @Belmode 既然一级缓存是默认开启的 为啥同一条查询语句 还是会执行多次呢
    HiJackXD
        15
    HiJackXD  
       2019-01-23 18:15:52 +08:00
    @shayang888 #14 一级缓存会因为你 or 框架(自动)调用 session.flush()/session.clear().导致一级缓存内的对象清空,所以会执行重复语句。 所以如果你手动开启一个 session,然后在里面查询同一对象,就不会执行 sql 语句了。
    HiJackXD
        16
    HiJackXD  
       2019-01-23 18:20:29 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5588 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:54 · PVG 10:54 · LAX 19:54 · JFK 22:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.