2017-04-11 12 views
0

私のアプリケーションでehcacheに問題があります。私はキャッシュに2つの異なるクエリdbを持っている2つのメソッドを格納する。問題は、第2の方法のデータが第1の方法のデータに格納され、ユーザが複数の要求をした場合、そのデータが毎回複製されることである。例えばSpring - ehcacheが正常に動作しない

  • まずコール - >
    • 方法1リターン商品
    • 方法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)); 

ありがとうございました!

答えて

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>(dataDAO.getData1(data, start_date, end_date)); 
arrayData.addAll(dataDAO.getData2(data, start_date, end_date)); 

またはEhcacheのは、設定オプションを持っている - documentation for version 2.xを参照してくださいおよびdocumentation for version 3.x

上記コードはnullではありません。

+0

ニース、今すぐ動作します、ありがとうございます。 – Yeray

関連する問題