2017-08-14 7 views
0

設定に有効期限が設定されているにもかかわらず、Igniteキャッシュからデータが削除されないように見えます。キャッシュテーブルにデータを挿入するのにを使用すると、この問題はに発生します。SQLを使用して挿入した場合、Igniteキャッシュ項目は削除されない

emplCache.query(new SqlFieldsQuery(
    "CREATE TABLE Employee (id LONG PRIMARY KEY, firstName VARCHAR, lastName VARCHAR, 
    salary DECIMAL, gender VARCHAR)")).getAll(); 
SqlFieldsQuery insertqry = new SqlFieldsQuery("INSERT INTO Employee (id, firstName, 
    lastName, salary, gender) values (?, ?, ?, ?, ?)"); 
emplCache.query(insertqry.setArgs(Long.toString(count), words[1], words[2], 
    words[3], words[4])).getAll(); 

これは、私は有効期限の設定方法だった:私はデータを挿入するdataStreamerを使用している場合、私は、この問題を見ていない、しかし

CacheConfiguration<?, ?> cfg = new CacheConfiguration<>(cacheName); 
    cfg.setCacheMode(CacheMode.PARTITIONED); 
    cfg.setName(cacheName); 
    cfg.setSqlSchema("PUBLIC"); 
    cfg.setAtomicityMode(CacheAtomicityMode.ATOMIC); 
    cfg.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(SECONDS, 1))); 

IgniteDataStreamer<Integer, Employee> stmr = ignite.dataStreamer(cfg.getName()) 
stmr.addData(id, emp); 

いくつかの設定が欠落しましたか?

[PS]はエフゲニーの答えの後に次のことをしようとしました:

// This is a util method that returns a cache config for the given cache name and the expiry time in seconds 
     CacheConfiguration<?, ?> cfg = CacheConfig.getCacheConfig("emplCache", 1); 
     IgniteCache<?, ?> emplCache = ignite.getOrCreateCache(cfg); 
     emplCache.query(new SqlFieldsQuery(
        "CREATE TABLE Employee (id LONG PRIMARY KEY, firstName VARCHAR, lastName VARCHAR, salary DECIMAL, gender VARCHAR)" 
        + "WITH \"template=emplCache\" ")).getAll(); 

を今私はキャッシュが存在しないことをこの例外を取得します。しかし、私はキャッシュを作成した後、テーブルを作成しようとしています:表の従業員が(それはそれのためにcretedされます)別のキャッシュ内に作成されます

Exception in thread "main" javax.cache.CacheException: class org.apache.ignite.internal.processors.query.IgniteSQLException: Cache doesn't exist: emplCache 
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:807) 
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:765) 
at com.demo.ignite.svc.CsvStreamer.main(CsvStreamer.java:33) 
Caused by: class org.apache.ignite.internal.processors.query.IgniteSQLException: Cache doesn't exist: emplCache 
at org.apache.ignite.internal.processors.query.h2.ddl.DdlStatementsProcessor.convert(DdlStatementsProcessor.java:277) 
at org.apache.ignite.internal.processors.query.h2.ddl.DdlStatementsProcessor.runDdlStatement(DdlStatementsProcessor.java:221) 
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryDistributedSqlFields(IgniteH2Indexing.java:1331) 
at org.apache.ignite.internal.processors.query.GridQueryProcessor$5.applyx(GridQueryProcessor.java:1815) 
at org.apache.ignite.internal.processors.query.GridQueryProcessor$5.applyx(GridQueryProcessor.java:1813) 
at org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36) 
at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:2293) 
at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:1820) 
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:795) 
+0

EvictionPolicyを設定する場所でキャッシュ設定を共有してください –

+0

コードに設定した正確な設定を含むように編集しました。私はこれ以上の設定をしていません。 ExpiryPolicyはEvictionPolicyと同じものと仮定します。または私は間違っていますか? –

答えて

1

構成さExpiryPolicyが使用できない理由、thatsの。

To configure this new cache add "WITH \"template=CACHE_NAME\"" 

ここで、CACHE_NAMEは、構成内のキャッシュ(またはテンプレート)の名前です。あなたの場合はcacheNameです。例えば

、あなたの作成スクリプトをに変更します。ここでは

emplCache.query(new SqlFieldsQuery(
      "CREATE TABLE Employee (id LONG PRIMARY KEY, firstName VARCHAR, lastName VARCHAR, salary DECIMAL, gender VARCHAR) " + 
       "WITH \"template=employee\" ")).getAll(); 

は、Javaからキャッシュを設定する場合は、あなたがして点火する名前emplCacheでこのキャッシュを追加する必要がありますlink to doc

です:

ignite.addCacheConfiguration(cfg); 
+0

私は "WITH \" template = CACHE_NAME \ ""節を試しました。私は例外を私の質問を更新しました。 –

+0

私の答えを更新しました –

関連する問題