1

私が取り組んでいるシッククライアントプロジェクトの場合、データベース(IBM iシリーズ)にリモートで接続し、SQL関連のいくつかのタスクを実行する必要があります。

  1. Download/Update a set of local/offline 'control' data-このデータは、気付かれずに実行間で変更された可能性があります。
  2. On command, download data from multiple (15-20) tables and store separately into a single Java object. テーブルの名前はわかっていますが、スキーマ名は実行ごとに変更され、実行間で変更される可能性があります(私が知る限りPreparedStatements、スキーマを動的に挿入することはできません)。結合/結合などを使用してこれらすべてのクエリを1つとして実行することを検討しましたが、プロジェクトでは、(1つの大きな結合された塊ではなく)テーブルデータをメモリ内で分離する必要があります。
  3. Perform between 2 and 100+ repetitions of (2)

最後の要因は、これを可能な限り最も古いコンピューターでJava 1.5を使用する高遅延(ダイヤルアップの可能性がある)ネットワーク接続で実行する必要があることです。

現在、動的に構築された15〜20を実行PreparedStatementsしていますが、これはかなり非効率的であることがわかっています(クヌースの時期尚早な最適化を回避するために、測定しました)。

これらのタスクを実行するための最も効率的でエラー耐性のある方法は何でしょうか?
私の考え:

  • に関して(1)は、テーブル全体を新しいテーブルと照合する以外にまったくわかりません。その時点で、新しい(場合によっては変更されていない)テーブルをダウンロードして古いテーブルを置き換えるだけでよいと思いますが、これには時間がかかります。
  • For (2):理想的には、ステートメントの配列に似たものを作成し、それらをすべて一度に送信して、データベースに内部クエリごとSELECTに1つを返すようにすることができます。ResultSetしかし、私が理解していることから、複数のオブジェクト を返すStatementこともサポートしていません。PreparedStatementResultSet
  • 最後に、私が考えることができる最善の方法は、いくつかの操作(3)をバッチ処理することです。(2)
4

2 に答える 2

2

移動要件があることについて特別なことは何もありませんが、ほとんどのデータベースと通信するときに使用する最も重要なことは、Javaアプリケーションに接続プールを設定して適切に使用することです。

これはここにも当てはまります。IBM i DB2 / 400データベースは非常に高速であり、jt400プロジェクトで使用可能なデータベースドライバー(タイプ4、ネイティブコードなし)は非常に優れているため、SQLを生成するだけで、短時間でかなりの量のデータをプルできます。急いで。

スキーマが1つしかない場合は、接続で必要なスキーマを指定でき、SQLステートメントで非修飾テーブル名を使用できることに注意してください。InfoCenterのJDBCプロパティを注意深く読んでください。正しく理解するには、少し注意が必要です。複数のスキーマが必要な場合、「naming = system」を使用すると、ライブラリリスト(つまり、テーブルを検索するためのスキーマのリスト)が可能になります。これは、正しく実行すると非常に便利です。IBMiの人々はここであなたを助けることができます。

とはいえ、接続が制限要因である場合は、「テーブルからオブジェクトを作成」JavaコードをIBMiで直接実行するという非常に強力なケースがあるかもしれません。これで、データベースへのトラフィックを測定できるようになる準備ができているはずです。ネットワーク監視ツールを使用するか、p6spyを使用するか、または単にプロキシを経由するか(おそらく、スロットルを使用する場合もあります)。

于 2012-08-15T17:15:50.720 に答える
0

理想的には、データベースへのアクセスを最適化するための一連のストアドプロシージャをデータベースグループに提供させる必要があります。

アクセス権がないため、データベースにタイムスタンプデータがあるかどうかを行レベルで確認して、レコードがいつ変更されたかを確認することをお勧めします。これにより、ある時点以降に変更されたデータのみを選択できます。

@ThorbjørnRavnAndersenが示唆しているのは、データベースコードをIBMホストに移動し、クライアントからRMIまたはJMSを介して接続することです。したがって、サーバーコードは、SQL結果セットをネットワーク経由で提供する代わりに、ユーザーに代わってデータベースにアクセスし、Javaオブジェクトを返すRMIまたはJMSサーバーになります。

私はあなたの要件をデータベースチームに渡し、彼らがあなたのために何かをすることができないかどうかを確認します。これらすべてのリモートクライアントが毎回すべてのデータをダウンさせることを望んでいないと確信しているので、それはあなたに利益をもたらすのと同じくらい彼らに利益をもたらすでしょう。

于 2012-08-15T17:08:56.987 に答える