記事ソース: データベースフォーラム 著者: jackma
Java Database Connectivity (JDBC) API は、Java プログラマがデータベースにアクセスできるようにする一連のインターフェイスです。さまざまな開発者のインターフェイスはまったく同じではありません。私は Oracle の JDBC を長年使用してきた結果、システムのパフォーマンスをより有効に活用し、より多くの機能を実現できるようにするための多くのスキルを蓄積してきました。
1. クライアント ソフトウェア開発で Thin ドライバーを使用する
Java ソフトウェアの開発に関して、Oracle のデータベースでは 4 種類のドライバが提供されています。2 つはアプリケーション ソフトウェア、アプレット、サーブレットなどのクライアント ソフトウェア用で、残りの 2 つはデータベース内の Java ストアド プロシージャなどのサーバー側ソフトウェア用です。クライアント側ソフトウェアの開発では、OCIドライバーまたはThinドライバーを選択できます。 OCI ドライバーは、Java Localization Interface (JNI) を利用して、Oracle クライアント ソフトウェアを通じてデータベースと通信します。 Thin ドライバーは、データベースと直接通信する純粋な Java ドライバーです。最大限のパフォーマンスを得るために、Oracle はクライアント ソフトウェアの開発で OCI ドライバーを使用することを推奨していますが、これは正しいようです。ただし、多くのテストを通じて、通常の状況では Thin ドライバーのパフォーマンスが OCI ドライバーのパフォーマンスを上回ることが判明しているため、Thin ドライバーの使用をお勧めします。
2. システムパフォーマンスを向上させるために自動送信機能をオフにします。
初めてデータベースへの接続を確立するとき、接続はデフォルトで自動コミット モードになります。パフォーマンスを向上させるために、次に示すように、Boolean false パラメーターを指定して Connection クラスの setAutoCommit() メソッドを呼び出すことにより、自動コミット機能をオフにすることができます。
conn.setAutoCommit(false);
自動コミット機能をオフにすると、Connection クラスの commit() メソッドと rollback() メソッドを呼び出してトランザクションを手動で管理する必要があることに注意してください。
3. 動的 SQL または時間制限のあるコマンドで Statement オブジェクトを使用する
SQL コマンドを実行する場合、PreparedStatement オブジェクトまたは Statement オブジェクトを使用するという 2 つのオプションがあります。同じ SQL コマンドを何度使用しても、PreparedStatement はその SQL コマンドを 1 回だけ解析してコンパイルします。 Statement オブジェクトを使用する場合、SQL コマンドが実行されるたびに解析され、コンパイルされます。このことから、PreparedStatement オブジェクトを使用した方が、Statement オブジェクトを使用するよりも高速であると思われるかもしれません。ただし、私が行ったテストでは、クライアント ソフトウェアではこれが当てはまらないことがわかりました。したがって、時間制限のある SQL 操作では、SQL コマンドがバッチで処理されない限り、Statement オブジェクトの使用を検討する必要があります。
さらに、Statement オブジェクトを使用すると、文字列を連結して有効な SQL コマンドを構築できるため、動的 SQL コマンドの作成も容易になります。したがって、Statement オブジェクトを使用すると、動的 SQL コマンドの作成と実行が容易になると思います。
4. ヘルパー関数を使用して動的 SQL コマンドをフォーマットする
Statement オブジェクトを使用して実行される動的 SQL コマンドを作成する場合、いくつかの書式設定の問題に対処する必要があります。たとえば、O'Reilly という名前をテーブルに挿入する SQL コマンドを作成する場合は、O'Reilly の「'」記号を 2 つの連続する「''」記号に置き換える必要があります。これを行う最善の方法は、置換操作を実行するヘルパー メソッドを作成し、接続文字列が数式を使用した SQL コマンドとして表現されるときに、作成されたヘルパー メソッドを使用することです。同様に、ヘルパー メソッドで Date 値を受け入れ、Oracle の to_date() 関数に基づいて文字列式を出力させることができます。
5. PreparedStatement オブジェクトを使用してデータベースの全体的な効率を向上させます
PreparedStatement オブジェクトを使用して SQL コマンドを実行すると、コマンドはデータベースによって解析およびコンパイルされてから、コマンド バッファーに配置されます。その後、同じ PreparedStatement オブジェクトが実行されるたびに、再度解析されますが、再度コンパイルされることはありません。プリコンパイルされたコマンドはバッファ内にあり、再利用できます。多数のユーザーがいるエンタープライズ レベルのアプリケーションでは、同じ SQL コマンドが繰り返し実行されることがよくありますが、PreparedStatement オブジェクトを使用することでコンパイルの数が削減され、データベース全体のパフォーマンスが向上します。クライアント側での PreparedStatement タスクの作成、準備、実行に Statement タスクよりも時間がかかる場合を除き、動的 SQL コマンドを除くすべての場合に PreparedStatement オブジェクトを使用することをお勧めします。
6. 繰り返しの挿入操作や更新操作のバッチ処理で PreparedStatement オブジェクトを使用する<br /> <br /> 挿入操作や更新操作をバッチ処理すると、それにかかる時間を大幅に短縮できます。 Oracle が提供する Statement と CallableStatement は実際にはバッチ処理をサポートしていません。実際にバッチ処理をサポートしているのは PreparedStatement オブジェクトだけです。 addBatch() メソッドとexecuteBatch() メソッドを使用して標準の JDBC バッチ処理を選択することも、PreparedStatement オブジェクトの setExecuteBatch() メソッドと標準のexecuteUpdate() メソッドを利用してより高速な Oracle 独自のメソッドを選択することもできます。 Oracle 独自のバッチ処理メカニズムを使用するには、以下に示すように setExecuteBatch() を呼び出します。
PreparedStatement pstmt3D null;
試す {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}