2017-04-11 74 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