java - Spring - ehcache 无法正常工作

标签 java spring ehcache

我的应用程序中存在 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));

非常感谢!

最佳答案

缓存工作正常,问题是你如何处理返回的结果。

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 不安全。

关于java - Spring - ehcache 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43343638/

相关文章:

java - 在 ant 中定义一个列表或一组变量

Java 全部替换,每出现两次就替换一次

java - Spring Boot 中的策略

java - Spring问题——NotWritablePropertyException

java - 从 Hibernate 5.2 升级到 5.3 时 SingletonEhCacheRegionFactory 不再可用

java - JUnit 中的实例变量

java - 如何将bean属性设置为另一个bean的属性

java - tomcat 4节点中的ehcache实现

distributed - 集成 Neo4J 和 Terracotta?

Java:谷歌地图的替代品