web-dev-qa-db-ja.com

大きなデータベースをJava=でコンテキストに応じて操作する最良の方法は何ですか?

Javaで非常に大きなDBを操作するためのベストプラクティスを理解しようとしています。

私たちがしていることは、一種のBI(ビジネスインテリジェンス)です。つまり、非常に大きなDBを分析し、それらを使用して、DBのインテリジェントな知識を表す中間DBを作成します。

現在JDBCを使用しており、ResultSetを使用してクエリを実行しています。

作成されるデータが増えるにつれ、これらの大きなDBを解析および操作するためのより適切な方法が存在するかどうか疑問に思っています。

  1. 一度にDB全体ではなく「チャンク」操作をサポートする必要があります(JDBCの制限、非常に低いパフォーマンスなど)
  2. 結果を取得して独自の新しいテーブルを作成するだけなので、常に接続している必要はありません。
  3. 長所と短所に関して、JDBCの代替案を理解したいと考えています。
  4. JDBCが最適な方法であるかどうかに関係なく、コンテキストに応じて実行するベストプラクティスは何ですか(たとえば、チャンクで照会される大規模なDBの場合)?
5
user19000

OK。詳しく説明します。

DBからデータをプルして、Javaオブジェクトに挿入し、Javaオブジェクトを編集してから、データベースに保存し直しますか?ある程度...しかし、大量のデータの場合はそうではありません。メリーランド州に住んでいるすべてのユーザーを無効にしたいとします。使用されていないすべての情報をJavaオブジェクト(firstname、birthdateなど)であり、編集されていなくてもそのユーザーのEVERYフィールドを更新しました。これは、大量の行のバッチ処理ではなく、単一レコードの編集では問題ありません。代わりに[update employee set status = 'disabled' where where = 'maryland']。

サンプルテーブルを作成し、1000万行の偽のデータを入力します。ものをJavaオブジェクトにロードするパフォーマンスと単純なセットベースのSQL更新を比較します。

1
user19382

はい、データベースが大きい場合は、このデータを格納するためにパーティションを使用できます。上記のように、小さな比較または分析操作のためにデータをフェッチするために単一のクエリを起動しないでください。

ストアドプロシージャとクエリ自体で処理される簡単なフィルタリング基準と、SQLクエリまたはサポートされるプロシージャでサポートされない複雑なアルゴリズムのみがレコードのフェッチ後にJavaで実行されるようにする必要があります。

1
Brijesh Mistry

これを行わないでください。大量のデータを分析する場合は、データベースで実行してください。

ストアドプロシージャ、一時テーブルなど.

それはデータであり、それがデータベースが得意なことです。 Javaを使用してリクエストを送信し、結果を読み取ります。DBMSはデータベース管理システムであるため、データを管理します。

1
Ben

IBM InfoSphereのようなエンタープライズツールは、JDBC接続で行ったこととまったく同じです。私はしばらくIBM DataStageスタジオに触れましたが、それを見ました。

あなたへの私のアドバイスは、大きなデータのスキーマを設計することです。これにより、中間データ変換を行うときに進行状況を(いくつかの列を使用して)書き留め、大きなタスクを小さな値に分割できます。進行状況の列。たとえば、1つのフェッチで20000行をフェッチし、2番目のフェッチのオフセットをマークするとします。

Javaでできる限り多くのことを行います。ログを記録する方法が多すぎるため、何かがうまくいかなかったときにデバッグします。DBに依存しすぎていると、私は思いませんデバッグとログ読み取りはそれほど快適です。

0
InformedA