Spring - ehcache不能正常工作

时间:2017-04-11 10:40:10

标签: java spring ehcache

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

例如:

  • 第一次通话 - >
    • 方法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));

非常感谢你!

1 个答案:

答案 0 :(得分: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>(dataDAO.getData1(data, start_date, end_date));
arrayData.addAll(dataDAO.getData2(data, start_date, end_date));

或Ehcache有配置选项,因此每次从缓存中读取内容时,缓存都会为您复制缓存 - 请参阅documentation for version 2.xdocumentation for version 3.x

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