繁体   English   中英

春天-ehcache无法正常工作

[英]Spring - ehcache doesn't work propertly

我的应用程序中的ehcache有问题。 我想在缓存中存储对数据库有两个不同查询的两个方法。 问题在于第二种方法的数据存储在第一种方法的数据中,并且当用户发出多个请求时,每次都会复制数据。

例如:

  • 首次通话->
    • 方法1返回0项
    • 方法2返​​回2个项目
  • 第二次调用->方法被缓存,只返回存储的数据,但是...
    • 方法1返回2项?
    • 方法2返​​回2个项目
  • 第三次通话->
    • 方法1返回4个项目
    • 方法2返​​回2个项目

道课:

public class DataDAOImpl extends JdbcDaoSupport implements DataDAO {
  @Autowired
  private JdbcTemplate jdbcTemplate1;

  @Autowired
  private JdbcTemplate jdbcTemplate2;

  @PostConstruct
  private void initialize() {
      setJdbcTemplate(jdbcTemplate1);
  }

  @Autowired
  private Environment env;


  @Cacheable("data_1")
  public List<Data> getData1(String data, String start_date, String end_date) {
      List<Data> list_data_1 = (List<Data>) jdbcTemplate1.query(
            env.getProperty("sql_data_1"),
            new BeanPropertyRowMapper<>(Data.class), 
            data, start_date, end_date);
      return list_data_1;
  }

  @Cacheable("data_2")
  public List<Data> getData2(String data, String start_date, String end_date) {
      List<Data> list_data_2 = (List<Data>) jdbcTemplate2.query(
            env.getProperty("sql_data_2"),
            new BeanPropertyRowMapper<>(Data.class), 
            data, start_date, end_date);
      return list_data_2;
  }
}

主班:

List<Data> arrayData = new ArrayList<Data>();   
arrayData = dataDAO.getData1(data, start_date, end_date);
arrayData.addAll(dataDAO.getData2(data, start_date, end_date));

非常感谢!

缓存工作正常,问题是您对返回的结果进行了处理。

List<Data> arrayData = new ArrayList<Data>();   
arrayData = dataDAO.getData1(data, start_date, end_date);
arrayData.addAll(dataDAO.getData2(data, start_date, end_date));

上面的代码更新了集合,没有进行任何防御性复制。 由于您很可能在堆上进行缓存,因此您可以有效地修改要缓存的内容。

因此,您可以在合并集合之前进行防御性复制:

List<Data> arrayData = new ArrayList<Data>(dataDAO.getData1(data, start_date, end_date));
arrayData.addAll(dataDAO.getData2(data, start_date, end_date));

或Ehcache具有配置选项,因此每次从高速缓存中读取某些内容时,它都是由高速缓存为您做一份副本-请参阅2.x 版的文档和3.x 版的 文档

请注意,上面的代码不是null安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM