Java Spring-ehcache不';工作不好

Java Spring-ehcache不';工作不好,java,spring,ehcache,Java,Spring,Ehcache,我的应用程序中的ehcache有问题。我想在缓存中存储两个对db有两个不同查询的方法。问题在于,第二种方法的数据存储在第一种方法的数据中,当用户发出多个请求时,每次都会重复数据 例如: 第一次呼叫-> 方法1返回0个项目 方法2返回2个项目 第二次调用->方法被缓存,只返回存储的数据,但是。。。 方法1返回2个项目 方法2返回2个项目 第三次呼叫-> 方法1返回4项 方法2返回2个项目 Dao类: public class DataDAOImpl extends JdbcDaoS

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

例如:

  • 第一次呼叫->
    • 方法1返回0个项目
    • 方法2返回2个项目
  • 第二次调用->方法被缓存,只返回存储的数据,但是。。。
    • 方法1返回2个项目
    • 方法2返回2个项目
  • 第三次呼叫->
    • 方法1返回4项
    • 方法2返回2个项目
Dao类:

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;
  }
}
公共类DataDAOImpl扩展JdbcDaoSupport实现DataDAO{
@自动连线
私有JdbcTemplate jdbcTemplate1;
@自动连线
私有JdbcTemplate jdbcTemplate2;
@施工后
私有void初始化(){
setJdbcTemplate(jdbcTemplate1);
}
@自动连线
私人环境署;
@可缓存(“数据1”)
公共列表getData1(字符串数据、字符串开始日期、字符串结束日期){
List\u data\u 1=(List)jdbcTemplate1.query(
环境getProperty(“sql_数据_1”),
新BeanPropertyRowMapper(Data.class),
数据、开始日期、结束日期);
返回列表\数据\ 1;
}
@可缓存(“数据_2”)
公共列表getData2(字符串数据、字符串开始日期、字符串结束日期){
List\u data\u 2=(List)jdbcTemplate2.query(
环境getProperty(“sql_数据_2”),
新BeanPropertyRowMapper(Data.class),
数据、开始日期、结束日期);
返回列表\数据\ 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 arrayData=new ArrayList();
arrayData=dataDAO.getData1(数据、开始日期、结束日期);
addAll(dataDAO.getData2(数据,开始日期,结束日期));

非常感谢你

缓存工作正常,问题是如何处理返回的结果

List<Data> arrayData = new ArrayList<Data>();   
arrayData = dataDAO.getData1(data, start_date, end_date);
arrayData.addAll(dataDAO.getData2(data, start_date, end_date));
List arrayData=new ArrayList();
arrayData=dataDAO.getData1(数据、开始日期、结束日期);
addAll(dataDAO.getData2(数据,开始日期,结束日期));
上面的代码更新集合,而不进行任何防御复制。由于您最有可能在堆上进行缓存,因此您可以有效地修改缓存内容

因此,要么在合并集合之前进行防御复制:

List<Data> arrayData = new ArrayList<Data>(dataDAO.getData1(data, start_date, end_date));
arrayData.addAll(dataDAO.getData2(data, start_date, end_date));
List arrayData=new ArrayList(dataDAO.getData1(数据、开始日期、结束日期));
addAll(dataDAO.getData2(数据,开始日期,结束日期));
或者Ehcache具有配置选项,因此每次从缓存中读取内容时,缓存都会为您进行复制-请参阅和


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

缓存工作正常,问题是如何处理返回的结果

List<Data> arrayData = new ArrayList<Data>();   
arrayData = dataDAO.getData1(data, start_date, end_date);
arrayData.addAll(dataDAO.getData2(data, start_date, end_date));
List arrayData=new ArrayList();
arrayData=dataDAO.getData1(数据、开始日期、结束日期);
addAll(dataDAO.getData2(数据,开始日期,结束日期));
上面的代码更新集合,而不进行任何防御复制。由于您最有可能在堆上进行缓存,因此您可以有效地修改缓存内容

因此,要么在合并集合之前进行防御复制:

List<Data> arrayData = new ArrayList<Data>(dataDAO.getData1(data, start_date, end_date));
arrayData.addAll(dataDAO.getData2(data, start_date, end_date));
List arrayData=new ArrayList(dataDAO.getData1(数据、开始日期、结束日期));
addAll(dataDAO.getData2(数据,开始日期,结束日期));
或者Ehcache具有配置选项,因此每次从缓存中读取内容时,缓存都会为您进行复制-请参阅和

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