1

Java アプリケーション (JDBC を使用) から Oracle 11g データベースから 3000 ~ 5000 レコードを取得するための推奨事項について専門家に尋ねたいと思います。私たちの標準は、常にストアド プロシージャを呼び出すことです。

調査を行ったところ、JDBC fetch count プロパティに基づいて、ref カーソルがデータベースに対して複数のラウンド トリップを行うことがわかりました。(参照カーソルを処理するときに、オラクルとJVMのメモリにデータがどのように格納されるかというエンドツーエンドのフローについて、誰かがもっと光を当てることができますか)

データがOracle dbから呼び出し元(Java)にワンショットで送信されるため(一括収集を使用)、コレクションの方が効率的であると考えていました。このアプローチにより、Java から Oracle サーバーへの複数のネットワーク呼び出しを回避できます。これは本当の仮定ですか?

あなたの助けに感謝!

4

1 に答える 1

2

これは、誰も投稿でコミットしようとするよりもはるかに大きなトピックです。Oracle が読み取り整合性を管理する方法について説明しているリンクを次に示します。そのページ全体は、サーバーで何が起こっているかを理解するのに役立つでしょう。コレクションを使用して何が起こるかを説明する記事もここにあります。コレクションを JDBC クライアントに返すにはどうすればよいでしょうか (私が試したことはありません)。

基本的に、データベースの構成方法から、ディスク パフォーマンスやクライアント パフォーマンスに対するネットワークの調整方法まで、パフォーマンスには多くのことが関係しています。

簡単な答えは、物事を試す必要があるということです。3 ~ 5,000 件のレコードを取得するのは大したことではありません。ネットワーク経由で取得できるかどうかは、レコードの大きさによって異なります。それらが 20 バイトのレコードで、ネットワーク (MTU?) サイズが 4k ブロックの場合、1 ブロックに約 200 レコードを収めることができます。ある時点で、収穫逓減の法則に遭遇します。

私は習慣としてストアド プロシージャを使用していますが、その必要はありません。それは、クエリの複雑さ (テーブルの数と結合の種類) と、DBA のような誰かがアクセスしてクエリの動作を確認できるかどうかによって異なります。

パケットに詰め込めるデータの量には限りがあるため、ネットワーク トリップについて心配することはあまり重要ではありません。何を使用しても、多数のネットワークトリップが発生します。それを最小限に抑えることがどれほど重要かを判断するのは、ユースケースによって異なります.

于 2015-10-28T14:59:21.330 に答える