2017-12-04 5 views
1

サードパーティの永続性のために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でも同じ結果を試しました。

私はここで何が欠けていますか?

ありがとうございます。

+0

奇妙に見えます。 フラッシュ頻度とフラッシュサイズの値を増やしてください。 これらのパラメータを設定するには、 'CacheConfiguration#setWriteBehindFlushSize(int)'(デフォルト値は10240)と 'CacheConfiguration#setWriteBehindFlushFrequency(long)'(デフォルト値は5秒)で適切な値を指定する必要があります。 フルキャッシュ設定で質問を更新できますか? – sk0x50

+0

遅く更新されましたが、キャッシュ構成が自動生成コードのCacheAtomicityMode.ATOMICに設定されていることがわかりました。私はそれをCacheAtomicityMode.TRANSACTIONに設定し、今はデータベースに書き込む前にtxn.commitまで待っています。ありがとうございました。 – aol

答えて

0

私は後でCacheAtomicityModeがCacheMode.ATOMICに設定され、CacheAtomicityMode.TRANSACTIONALに変更されており、もはや行ごとにDBに書き込まれていないことに気付きました。

関連する問題