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

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

  •  
  •   shayang888 · 316 天前 · 2847 次点击
    这是一个创建于 316 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    比如只要用个本地+简单+性能高的缓存,可以用 caffeine
        8
    shayang888   316 天前
    @honeycomb 那一级缓存呢?我看了下网上 好像 cacheable 也是说的二级缓存
        9
    xipushi   316 天前
    private static final Map<String,Object> cache = new HashMap<>(); 这种缓存最通用,有 java 环境就可以用了。
    我也没搞懂一级缓存,二级缓存。赶脚一级缓存,就是针对使用频率高的数据缓存。二级缓存,是对使用频率低的数据缓存。
    Mysql 服务器针对 SQL 还有缓存,这是几级缓存?
        10
    cnxobo   316 天前
    J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的 Ehcache 缓存数据丢失。https://www.oschina.net/p/j2cache
        11
    HiJackXD   316 天前 via iPhone
    一级缓存关不掉的,hibernate 增删改查都会把对象放入一级缓存 session [很多人可能不知道,保存一个非持久化的对象,对象其实也会被放入 session]
        12
    shayang888   316 天前
    @HiJackXD 那我怎么知道有没有一级缓存
        13
    Belmode   316 天前
    @xipushi 这里的缓存是应用框架层的缓存,不是物理层的。SpringData JPA 默认的实现是 Hibernate,所以一级缓存是 SqlSession 级别的,这个 Hibernate 默认是开启的。 @Cacheable 注解开启的是二级缓存,它会去环境寻找其他第三方缓存接口,如果没找到,默认使用自身实现的简单 Map 来存储。
        14
    shayang888   316 天前
    @Belmode 既然一级缓存是默认开启的 为啥同一条查询语句 还是会执行多次呢
        15
    HiJackXD   316 天前
    @shayang888 #14 一级缓存会因为你 or 框架(自动)调用 session.flush()/session.clear().导致一级缓存内的对象清空,所以会执行重复语句。 所以如果你手动开启一个 session,然后在里面查询同一对象,就不会执行 sql 语句了。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1379 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 17:19 · PVG 01:19 · LAX 09:19 · JFK 12:19
    ♥ Do have faith in what you're doing.