簡體   English   中英

春天-ehcache無法正常工作

[英]Spring - ehcache doesn't work propertly

我的應用程序中的ehcache有問題。 我想在緩存中存儲對數據庫有兩個不同查詢的兩個方法。 問題在於第二種方法的數據存儲在第一種方法的數據中,並且當用戶發出多個請求時,每次都會復制數據。

例如:

  • 首次通話->
    • 方法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));

非常感謝!

緩存工作正常,問題是您對返回的結果進行了處理。

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具有配置選項,因此每次從高速緩存中讀取某些內容時,它都是由高速緩存為您做一份副本-請參閱2.x 版的文檔和3.x 版的 文檔

請注意,上面的代碼不是null安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM