2017-04-11 88 views
0

我在应用程序中遇到ehcache问题。我想要在缓存中存储两个有两个不同的db查询的方法。问题是第二种方法的数据存储在第一种方法的数据中,并且当用户发出多个请求时,数据每次都被复制。Spring - ehcache不起作用

例如:

  • 首先呼叫 - >
    • 方法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; 
    } 
} 

主要类:

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

太谢谢你了!

回答

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安全。

+0

不错,现在很有用,非常感谢。 – Yeray