[英]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.