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. システムのパフォーマンスを向上させるために自動送信機能をオフにします。
初めてデータベースとの接続を確立するとき、接続はデフォルトで自動送信モードになります。パフォーマンスを向上させるために、次のように、ブール値 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 オブジェクトを使用して、繰り返し挿入または更新操作をバッチで処理する
と、挿入および更新操作に必要な時間を大幅に短縮できます。 Oracle が提供する Statement と CallableStatement は実際にはバッチ処理をサポートしていません。実際にバッチ処理をサポートしているのは PreparedStatement オブジェクトだけです。 addBatch() メソッドとexecuteBatch() メソッドを使用して標準の JDBC バッチ処理を選択することも、PreparedStatement オブジェクトの setExecuteBatch() メソッドと標準のexecuteUpdate() メソッドを利用してより高速な Oracle 独自のメソッドを選択することもできます。 Oracle 独自のバッチ処理メカニズムを使用するには、次のように setExecuteBatch() を呼び出します。
PreparedStatement
pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30)
...
pstmt.executeUpdate();
}
() は上限です。この値に達すると、SQL コマンドの実行が自動的にトリガーされ、標準のexecuteUpdate() メソッドがバッチ処理としてデータベースに送信されます。 PreparedStatement クラスの sendBatch() メソッドを呼び出すことで、いつでもバッチ タスクを転送できます。
7. Oracle ロケーター メソッドを使用してラージ オブジェクト (LOB) を挿入および更新します。Oracle
の PreparedStatement クラスは、BLOB や CLOB などのラージ オブジェクトの処理を完全にはサポートしません。特に、Thin ドライバーは setObject() を使用した設定をサポートしません。 PreparedStatement オブジェクトの setBinaryStream() メソッドは、BLOB の値では、setCharacterStream() メソッドを使用した CLOB の値の設定をサポートしていません。ロケーター自体のメソッドのみがデータベースから LOB タイプの値を取得できます。 PreparedStatement オブジェクトを使用して LOB を挿入または更新できますが、LOB の値を取得するにはロケーターを使用する必要があります。これら 2 つの問題があるため、LOB 値の挿入、更新、または取得にはロケーター メソッドを使用することをお勧めします。
8. SQL92 構文を使用してストアド プロシージャを呼び出す
ストアド プロシージャを呼び出すときは、SQL92 または Oracle PL/SQL を使用できます。Oracle PL/SQL を使用すると、アプリケーションを保守する開発者に問題が生じます。したがって、ストアド プロシージャを呼び出すときは SQL92 を使用することをお勧めします。
9. オブジェクト SQL を使用してオブジェクト スキーマをデータベースに転送します。Oracle
のデータベースはオブジェクト指向データベースとして使用できるため、アプリケーション内のオブジェクト指向スキーマをデータベースに転送することを検討できます。現在のアプローチは、偽装データベース オブジェクトとして Java Bean を作成し、そのプロパティをリレーショナル テーブルにマップしてから、これらの Bean にメソッドを追加するというものです。 Java でこれを行うことには問題はありませんが、操作はデータベースの外部で実行されるため、データベースにアクセスする他のアプリケーション ソフトウェアはオブジェクト モデルを利用できません。 Oracle のオブジェクト指向テクノロジを利用すると、新しいデータベース オブジェクト タイプを作成してデータベース内のデータと操作をシミュレートし、JPublisher などのツールを使用して独自の Java Bean クラスを生成できます。この方法を使用すると、Java アプリケーションだけでなく、アプリケーション内のデータや操作を共有する必要がある他のアプリケーション ソフトウェアもアプリケーション ソフトウェアのオブジェクト モデルを使用できます。
10. SQL を使用してデータベース内の操作を完了する
私が紹介したい最も重要な経験は、Java などの手続き型プログラミング言語を使用するのではなく、SQL のセット指向のアプローチを最大限に活用してデータベース処理のニーズを解決することです。
プログラマーが 1 つのテーブルで多数の行を検索する場合、結果の各行は他のテーブルのデータを検索することになります。最後に、プログラマーは最初のテーブルのデータをバッチで更新するための個別の UPDATE コマンドを作成しました。これと同様のタスクは、UPDATE コマンドで set 句で複数列のサブクエリを使用して実行できます。タスクを 1 つの SQL コマンドで実行できるのに、なぜインターネット上にデータを流す必要があるのでしょうか?ユーザーには、SQL の能力を最大限に高める方法を注意深く学ぶことをお勧めします。
著者: picva 出典: CCID テクノロジー コミュニティ