2016-05-12 13 views
0

私はクライアントサーバーCorbaアプリケーションを持っています。いくつかの呼び出しでは、返されるデータが膨大であるため、ServerはイテレータオブジェクトをClientに提供します。現在の実装 - サーバは(MySQL)データベースからすべての関連データを取り出し、クライアントがすべてのデータの取得を完了するまでメモリに保存します(getNext_n()コール)。すでに、反復子の総数とその存続期間(エビクタパターン)には制限があります。ほとんどのオープンイテレータが膨大なデータを持っていると、今やServerはOut of Memoryになることがあります。Corba IteratorのためのMySQLからの一括データ取得

  1. このようなシナリオを処理するにはどうすればよいでしょうか?
  2. ローカルでキャッシュするのではなく、チャンク(制限を使用)でDBからデータをフェッチすることができます。しかし、他のスレッドがテーブルの行を挿入/削除すると、選択によって不整合なデータが返されます。一時テーブルを使用すると、追加のディスク使用量を意味します。 MySQLは、このようなシナリオを処理するための他のメカニズムを提供していますか?

答えて

0

Corbaサーバー上のMySQLから何もバッファーする必要はありません。 サーバでMySQLクエリを実行し、イテレータをクライアントに送信できます。 次に、MySQLクエリ結果セットから行を取得し、すぐにクライアントに送信します。結果セットのすべての行についてこれを繰り返します。

注意が必要なのは、イテレータのタイムアウトを設定することです。クライアントはしばらくの間、1回の繰り返しを完了する必要があります。この時間は、MySQLが結果セットからの2つのローフェッチの間に経過するのを許す時間より短くなければなりません。

また、クエリ中にテーブルのデータが変更された場合、結果のフェッチに時間がかかりすぎると、MySQL UNDOログを満たす可能性があるため、タイムアウトが必要です。

関連する問題