涉及逐出时,Spring的缓存注释是否可以安全使用?

布莱恩

我正在使用Spring 4.0.3,并利用了由EhCache 2.8.1支持的Cache Abstraction功能。

我担心方法级别的注释,@Cacheable并且@CacheEvict在编辑高速缓存时可能无法正确锁定高速缓存,从而导致线程安全问题。我在下面的测试似乎证实了这一点。我的问题是,我是在滥用框架还是在误解测试结果?还是我得出的结论是,注解不会导致缓存被正确锁定,因此使用@CacheEvict不能保证将来的读取有效吗?

测试:

创建数据库表以存储计数器值

create table counter
(
    counter integer
);
insert into counter values(0);

在ehcache.xml中创建一个条目以缓存计数器值

<cache name="counter"
    eternal="true"
    maxElementsInMemory="1"/>

在Spring控制器中创建两种请求映射方法-一种读取计数器的值并在长时间延迟后返回,另一种递增该值然后快速返回

@RequestMapping("/viewcounter")
@ResponseBody
@Cacheable(value = "counter", key = "1")
public int readCounter() {
    int count = dao.selectInteger("select counter from counter");
    try {
        Thread.sleep(5000);
    }
    catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    return count;
}

@RequestMapping("/incrementcounter")
@ResponseBody
@CacheEvict(value = "counter", key = "1")
public int incrementCounter() {
    dao.update("update counter set counter = counter + 1");
    int count = dao.selectInteger("select counter from counter");
    return count;
}

在两种不同的情况下执行以下三个步骤-首先从控制器方法中删除缓存注释,然后再将其添加回

  1. 访问 /incrementcounter
  2. 在一个浏览器标签中,访问/viewcounter,然后在发起此请求后立即/incrementcounter在另一个标签中访问
  3. 访问 /viewcounter

检测结果

Expected result: 2
Actual result without caching: 2
Actual result with caching: 1

缓存结果是错误的,是吗?

斯蒂芬·尼科尔(Stephane Nicoll)

缓存抽象中没有锁定。不是第一个要求它的人,我们已经在内部进行了广泛的头脑风暴,以讨论支持它的成本。事实证明,它远非简单,以这种抽象方式使用锁可能非常棘手,尤其是以“通用”方式。同样,缓存供应商花费大量资源来支持此类用例,这是有原因的。

目前,我最好的猜测是,如果您想要这些功能,则需要缓存进行事务处理。但是,将其与抽象一起使用时有些陷阱,请特别检查目前正在研究的SPR-11540

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring缓存:逐出多个缓存

来自分类Dev

Spring的@CachePut注释是否可以使用void返回类型?

来自分类Dev

您可以将Ignite缓存备份逐出磁盘吗?

来自分类Dev

在LVM上使用LUKS时,LVM缓存是否会导致安全性泄漏?

来自分类Dev

在Java 8默认接口方法上使用Spring @Transactional注释是否安全?

来自分类Dev

使用@Async 注释时的线程安全

来自分类Dev

在keycloak中使用spring安全注释

来自分类Dev

基于Spring注释的缓存

来自分类Dev

基于Spring注释的缓存

来自分类Dev

当来自外部依赖项时,带有Spring DI注释的CDI是否可以工作?

来自分类Dev

在安全组规则中使用安全组作为源时,是否可以匹配公共IP?

来自分类Dev

使用Spring的cut ehcache逐出策略

来自分类Dev

使用Spring的cut ehcache逐出策略

来自分类Dev

基于事务的缓存逐出

来自分类Dev

基于事务的缓存逐出

来自分类Dev

每个实体逐出Infinispan,使用Java注释控制寿命

来自分类Dev

在Oracle OAS中使用连接池时是否可以禁用隐式连接缓存?

来自分类Dev

在包上使用@ParametersAreNonnullByDefault 注释时,IntelliJ 是否可以自动生成代码以进行空检查参数

来自分类Dev

是否可以在Spring Repository @Query注释中使用Array对象作为参数?

来自分类Dev

使用带有注释的Spring Boot是否可以处理来自多个WMQ队列的消息?

来自分类Dev

如果将属性设置为不同的 bean 列表,是否可以在 Spring 中使用注释创建 bean?

来自分类Dev

Spring @Transactional是否使用任何Hibernate缓存?

来自分类Dev

Spring @Transactional是否使用任何Hibernate缓存?

来自分类Dev

Spring Memcached注释未缓存

来自分类Dev

使用涉及元素列表的 JAXB 和 XML 注释时嵌套编组

来自分类Dev

使用Canvas时是否可以避免“操作不安全”?

来自分类Dev

使用ffmpeg进行转换时,是否可以安全地省略编解码器?

来自分类Dev

Firestore 安全规则 - 使用自定义身份验证时是否可以限制数据访问

来自分类Dev

使用缓存编写器的咖啡因缓存基于时间的逐出

Related 相关文章

  1. 1

    Spring缓存:逐出多个缓存

  2. 2

    Spring的@CachePut注释是否可以使用void返回类型?

  3. 3

    您可以将Ignite缓存备份逐出磁盘吗?

  4. 4

    在LVM上使用LUKS时,LVM缓存是否会导致安全性泄漏?

  5. 5

    在Java 8默认接口方法上使用Spring @Transactional注释是否安全?

  6. 6

    使用@Async 注释时的线程安全

  7. 7

    在keycloak中使用spring安全注释

  8. 8

    基于Spring注释的缓存

  9. 9

    基于Spring注释的缓存

  10. 10

    当来自外部依赖项时,带有Spring DI注释的CDI是否可以工作?

  11. 11

    在安全组规则中使用安全组作为源时,是否可以匹配公共IP?

  12. 12

    使用Spring的cut ehcache逐出策略

  13. 13

    使用Spring的cut ehcache逐出策略

  14. 14

    基于事务的缓存逐出

  15. 15

    基于事务的缓存逐出

  16. 16

    每个实体逐出Infinispan,使用Java注释控制寿命

  17. 17

    在Oracle OAS中使用连接池时是否可以禁用隐式连接缓存?

  18. 18

    在包上使用@ParametersAreNonnullByDefault 注释时,IntelliJ 是否可以自动生成代码以进行空检查参数

  19. 19

    是否可以在Spring Repository @Query注释中使用Array对象作为参数?

  20. 20

    使用带有注释的Spring Boot是否可以处理来自多个WMQ队列的消息?

  21. 21

    如果将属性设置为不同的 bean 列表,是否可以在 Spring 中使用注释创建 bean?

  22. 22

    Spring @Transactional是否使用任何Hibernate缓存?

  23. 23

    Spring @Transactional是否使用任何Hibernate缓存?

  24. 24

    Spring Memcached注释未缓存

  25. 25

    使用涉及元素列表的 JAXB 和 XML 注释时嵌套编组

  26. 26

    使用Canvas时是否可以避免“操作不安全”?

  27. 27

    使用ffmpeg进行转换时,是否可以安全地省略编解码器?

  28. 28

    Firestore 安全规则 - 使用自定义身份验证时是否可以限制数据访问

  29. 29

    使用缓存编写器的咖啡因缓存基于时间的逐出

热门标签

归档