目次 | 前の項目 | 次の項目 | JDBCTM ガイド: 入門 |
Java はマルチスレッド環境なので、文の非同期実行のサポートが実際に必要になることはありません。プログラムで、メインスレッドに対して非同期に文を実行する必要がある場合は、独立したスレッドを簡単に作成できます。
ドライバにより、並列実行の程度に差がある場合があります。ただし、開発は、完全な並列実行が行われることを前提に進めることができます。つまり、ドライバでなんらかの形式の同期処理が必要な場合は、ドライバがその処理を行います。開発者から見たときの唯一の違いは、アプリケーションの動作が完全には並列ではなくなるということです。
たとえば、開発者の目から見ると、同じ Connection で 2 つの Statement を並行して実行し、その ResultSet を並行して処理できます。この処理を完全に並行して実行するドライバもありますが、1 つの文を実行し、その完了を待ってから次の文を送信するドライバもあります。
マルチスレッドの具体的な使用方法の 1 つは、長時間実行している文をキャンセルする場合です。あるスレッドで実行している文をキャンセルするには、別のスレッドで Statement.cancel() メソッドを呼び出します。
実際に望ましいのは、大部分の JDBC オブジェクトにはシングルスレッドの方式だけでアクセスすることです。ただし、マルチスレッドのサポートが必要な場合もあり、マルチスレッドに対して安全なクラスと安全でないクラスを指定するこれまでの原案での試みは、かえって状況を混乱させてしまったようです。
複数の文を 1 つのトランザクションの中で実行するには、まず、Connection.setAutoCommit(false) メソッドを呼び出して、自動コミットを無効にする必要があります。
自動コミットを無効にすると、接続に対応する暗黙のトランザクションが常に作成されます。Connection.commit を実行するとトランザクションは完了し、Connection.rollback を実行するとトランザクションは強制終了されます。コミットまたはロールバックを実行すると、新しい暗黙のトランザクションが開始します。
トランザクションの正確なセマンティクスとトランザクションの遮断レベルは、背後のデータベースにより異なります。java.sql.DatabaseMetaData には現在のデフォルトを知るためのメソッドがあり、java.sql.Connection には新しく開いた接続を別の遮断レベルに移すメソッドがあります。
インタフェースの最初のバージョンでは、異なる接続の間でトランザクションをコミットする機能はサポートされません。