Spring - ehcache 无法正常工作

Spring - ehcache doesn't work propertly

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

例如:

道class:

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;
  }
}

主要class:

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 具有配置选项,因此每次从缓存中读取某些内容时,缓存都会为您做一份副本 - 请参阅 documentation for version 2.x and documentation for version 3.x

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