2017-10-03 9 views
2

キャッシュが空であるため、sqlクエリはnullを返します。 リードスルーとは、キャッシュが失われた場合、Igniteが自動的に基になるデータベース(または永続ストア)にアクセスして対応するデータをロードすることを意味します。点火時のリードスルー動作

基礎となるdbテーブルに新しいデータが挿入されている場合、キャッシュテーブルをダウンロードして新しく挿入したデータをdbテーブルから自動的にロードするか、自動的に同期させる必要がありますか?

Springの@Cacheableと同じ働きをするか、別の方法で動作します。
答えは「いいえ」であることがわかります。キャッシュのSQLクエリは、キャッシュにデータがないと動作しませんが、私は結果を以下しまったでcache.getをしようとしたとき:

ケース1:

System.out.println("data == " + cache.get(new PersonKey("Manish", "Singh")).getPhones()); 

結果==>データ== 1235

ケース2:

PersonKey per = new PersonKey(); 
per.setFirstname("Manish"); 
System.out.println("data == " + cache.get(per).getPhones()); 

はエラーをスロー: - error imageを以下のように、image2

+0

リードスルーは –

答えて

0

あなたのケース2では、lastnameも指定してみましたか?あなたのスタックトレースによって、Cassandraはそれがnullではないことを予期していることが明らかです。

+0

なし、私が指定していないとして姓がnull値を取られ、私の設定ファイルにおいても同様です。 –

+0

@ManishJaiswalそれを指定してみてください。 – alamar

+0

これはうまくいきません。同じエラーが発生しました@alamar –

1

データベースに何かを挿入し、それがまだキャッシュにない場合は、その後、読み通しが有効になっているとCacheStoreのが設定されている場合操作はDBから欠損値を取得します取得しますが。

現在のところ、キャッシュ上で実行されるSQLクエリではこのように動作しません。最初にloadCacheを呼び出すと、キャッシュに値が表示され、SQLで使用できるようになります。

を取得すると、namelastnameの正確な組み合わせがDBで求められます。 lastname=nullの条件を含むCQLクエリに変換され、lastnamenullになることはできないため、失敗します。

UPD:

は、あなたが最初に適切な述語とloadCacheを行うことができます「マニッシュ」に等しいfirstname列を持つすべてのレコードを取得し、キャッシュ上のSQLクエリを実行します。 loadCacheは複雑な操作で、DB内のすべてのレコードを超える実行するために必要なので、それはあまりにも頻繁に呼び出されるべきではないこと

cache.loadCache((k, v) -> v.lastname.equals("Manish")); 

SqlFieldsQuery qry = new SqlFieldsQuery("select firstname, lastname from Person where firstname='Manish'"); 

try (FieldsQueryCursor<List<?>> cursor = cache.query(qry)) { 
    for (List<?> row : cursor) 
     System.out.println("firstname:" + row.get(0) + ", lastname:" + row.get(1)); 
} 

注意。述部としてnullを指定すると、すべてのレコードがデータベースからロードされます。

また、SQLをキャッシュ上で高速に実行するには、firstnameフィールドをQueryEntityのインデックスに設定する必要があります。

+0

loadCacheを呼び出すには、キーを提供する必要があります。そのキーがなければ、新しい値をロードできません。私のシナリオのように、私は姓ではなくファーストネームの値しか持っていません。 –

+0

@ManishJaiswalは、loadCacheを実行するためのキーを提供する必要はありません。 loadCacheはオプションの述語をとります。私は答えを更新し、その詳細を追加しました。 – Denis

+0

ありがとう、そのクエリは動作しましたが、リモートサーバーを起動して初めて初めてでした。 2回目のSQLまたはテキストキャッシュクエリのプログラムが実行されていないときに、私のigniteリモートサーバを再起動するまで動作しません。 –

4

読み取るセマンティクスは、読み取る既知のキーセットがある場合に適用できます。これはSQLのケースではないので、あなたのデータが任意のサードパーティストア(RDBMS、Cassandra、HBase、...)にある場合)、クエリを実行する前にデータをメモリにプリロードする必要があります。

ただし、Igniteはこの制限を排除するネイティブ永続ストレージ[1]を提供します。メモリに何も持たずにIgnite APIを使用することができます。これにはSQLクエリも含まれています。データは、使用中にオンデマンドでメモリにフェッチされます。

は、[1] https://apacheignite.readme.io/docs/distributed-persistent-store

関連する問題