[英]Spring - ehcache doesn't work propertly
我的應用程序中的ehcache有問題。 我想在緩存中存儲對數據庫有兩個不同查詢的兩個方法。 問題在於第二種方法的數據存儲在第一種方法的數據中,並且當用戶發出多個請求時,每次都會復制數據。
例如:
道課:
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.