Spring - ehcache 无法正常工作
Spring - ehcache doesn't work propertly
我的应用程序中的 ehcache 有问题。我想在缓存中存储两个对数据库有两个不同查询的方法。问题是第二种方法的数据存储在第一种方法的数据中,当用户多次请求时,数据每次都是重复的。
例如:
- 第一次调用 ->
- 方法 1 return 0 项
- 方法 2 return 2 项
- 第二次调用 -> 方法被缓存,只是 return 存储的数据但是...
- 方法 1 return 2 项 ¿?
- 方法 2 return 2 项
- 第三次调用 ->
- 方法 1 return 4 项 ¿?
- 方法 2 return 2 项
道class:
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;
}
}
主要class:
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 具有配置选项,因此每次从缓存中读取某些内容时,缓存都会为您做一份副本 - 请参阅 documentation for version 2.x and documentation for version 3.x。
请注意,上面的代码 null
不安全。
我的应用程序中的 ehcache 有问题。我想在缓存中存储两个对数据库有两个不同查询的方法。问题是第二种方法的数据存储在第一种方法的数据中,当用户多次请求时,数据每次都是重复的。
例如:
- 第一次调用 ->
- 方法 1 return 0 项
- 方法 2 return 2 项
- 第二次调用 -> 方法被缓存,只是 return 存储的数据但是...
- 方法 1 return 2 项 ¿?
- 方法 2 return 2 项
- 第三次调用 ->
- 方法 1 return 4 项 ¿?
- 方法 2 return 2 项
道class:
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;
}
}
主要class:
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 具有配置选项,因此每次从缓存中读取某些内容时,缓存都会为您做一份副本 - 请参阅 documentation for version 2.x and documentation for version 3.x。
请注意,上面的代码 null
不安全。