サードパーティの永続性のためにMS SQL Serverを使用しています。私の意図は、データベースからデータグリッドにデータをロードし、計算を実行し(分散させて)、最終結果をSQL Serverに書き戻すことです。処理するレコードの数は100万を超えるレコードなので、レコードはレコード単位ではなく、バッチ単位(たとえば、間隔ごと、またはXミリ秒ごと)に永続化する必要はありません。ここで私は私のノードを構成した方法は次のとおりです。ここでライトスルーとライトビハインドを有効にしますが、レコードごとに行が維持されます
ccfg.setReadThrough(true);
ccfg.setWriteThrough(true);
ccfg.setWriteBehindEnabled(true);
ccfg.setWriteBehindBatchSize(10000);
は、キャッシュへの計算とput
を実行するコードは次のとおりです。
int i = 0;
for (ComputePOJO computeItem : computeItems) {
InvoiceItem invoiceItem = calcInvoiceItem();
InvoiceItemKey key = new InvoiceItemKey(invoiceId, contractItemId);
invoiceItem.setId(key);
invoiceItemCache.put(key, invoiceItem);
i++;
if (i % 1000 == 0) {
System.out.printf("> Computed %s InvoiceItems...%n", i);
}
}
私はput
呼び出しにブレークポイントを入れて、レコードをカウントした場合(SQL ServerのSELECT COUNT(*) FROM InvoiceItem
クエリ)putコールの前後で、write-behindを有効にして10秒ごとに書き込むように設定していても、レコードがすぐにディスクに書き込まれたことがわかりました。私はputAsync
でも同じ結果を試しました。
私はここで何が欠けていますか?
ありがとうございます。
奇妙に見えます。 フラッシュ頻度とフラッシュサイズの値を増やしてください。 これらのパラメータを設定するには、 'CacheConfiguration#setWriteBehindFlushSize(int)'(デフォルト値は10240)と 'CacheConfiguration#setWriteBehindFlushFrequency(long)'(デフォルト値は5秒)で適切な値を指定する必要があります。 フルキャッシュ設定で質問を更新できますか? – sk0x50
遅く更新されましたが、キャッシュ構成が自動生成コードのCacheAtomicityMode.ATOMICに設定されていることがわかりました。私はそれをCacheAtomicityMode.TRANSACTIONに設定し、今はデータベースに書き込む前にtxn.commitまで待っています。ありがとうございました。 – aol