目次 | 前の項目 | 次の項目 JDBCTM ガイド: 入門


9 非同期処理、スレッド、トランザクション

9.1     非同期要求

ODBC など一部のデータベース API では、SQL 文を非同期に実行できる機構が提供されています。この機構を使うと、アプリケーションは、バックグラウンドでデータベース操作を開始し、その操作の完了を待つ間、ユーザインタフェースの管理などほかの処理を行うことができます。

Java はマルチスレッド環境なので、文の非同期実行のサポートが実際に必要になることはありません。プログラムで、メインスレッドに対して非同期に文を実行する必要がある場合は、独立したスレッドを簡単に作成できます。

9.2     マルチスレッド

すべての java.sql オブジェクトで行われるすべての操作は、マルチスレッドに対して安全で、同じオブジェクトを同時に呼び出す複数のスレッドを正しく処理できなければなりません。

ドライバにより、並列実行の程度に差がある場合があります。ただし、開発は、完全な並列実行が行われることを前提に進めることができます。つまり、ドライバでなんらかの形式の同期処理が必要な場合は、ドライバがその処理を行います。開発者から見たときの唯一の違いは、アプリケーションの動作が完全には並列ではなくなるということです。

たとえば、開発者の目から見ると、同じ Connection で 2 つの Statement を並行して実行し、その ResultSet を並行して処理できます。この処理を完全に並行して実行するドライバもありますが、1 つの文を実行し、その完了を待ってから次の文を送信するドライバもあります。

マルチスレッドの具体的な使用方法の 1 つは、長時間実行している文をキャンセルする場合です。あるスレッドで実行している文をキャンセルするには、別のスレッドで Statement.cancel() メソッドを呼び出します。

実際に望ましいのは、大部分の JDBC オブジェクトにはシングルスレッドの方式だけでアクセスすることです。ただし、マルチスレッドのサポートが必要な場合もあり、マルチスレッドに対して安全なクラスと安全でないクラスを指定するこれまでの原案での試みは、かえって状況を混乱させてしまったようです。

9.3     トランザクション

新しい JDBC 接続は、最初、「自動コミット」モードになっています。つまり、データベースでは、それぞれの文が個別のトランザクションとして実行されます。

複数の文を 1 つのトランザクションの中で実行するには、まず、Connection.setAutoCommit(false) メソッドを呼び出して、自動コミットを無効にする必要があります。

自動コミットを無効にすると、接続に対応する暗黙のトランザクションが常に作成されます。Connection.commit を実行するとトランザクションは完了し、Connection.rollback を実行するとトランザクションは強制終了されます。コミットまたはロールバックを実行すると、新しい暗黙のトランザクションが開始します。

トランザクションの正確なセマンティクスとトランザクションの遮断レベルは、背後のデータベースにより異なります。java.sql.DatabaseMetaData には現在のデフォルトを知るためのメソッドがあり、java.sql.Connection には新しく開いた接続を別の遮断レベルに移すメソッドがあります。

インタフェースの最初のバージョンでは、異なる接続の間でトランザクションをコミットする機能はサポートされません。



目次 | 前の項目 | 次の項目
jdbc@wombat.eng.sun.com または jdbc-odbc@wombat.eng.sun.com
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved.