9

DriverManager.getConnection()とを使用して接続オブジェクトを取得した場合、それらのオブジェクトで呼び出されたDataSource.getConnection()ときの動作はどのように異なりますか?.close()

.close()メソッドを呼び出す前に、これら2つの異なる接続から関連するオブジェクトを取得Statementしました。ResultSetこれらの2つのオブジェクトを取得した直後に、connection1.close()(を介してDriverManager.getConnection())と言うと、接続オブジェクトが無効になり、関連するStatementオブジェクトとResultSetオブジェクトにアクセスすることは想定されていません。私が間違っている場合は私を修正しますか?

2番目のシナリオでは、connection2.close()(を介してDataSource.getConnection())と言うと、単にプールに戻ります。しかし、接続はまだ生きています。関連するオブジェクトStatementにアクセスできますか?ResultSet

4

3 に答える 3

6

(基本)DataSource(つまり、接続プールを行わない接続)を想定すると、 DriverManager(一部のドライバーはデータソースのDriverManagerを内部的に使用するか、DriverManagerのデータソースを使用する)から取得したものと同じ物理接続を取得します。 )。したがって、これらの接続は同じように動作します。

ここで、が接続プールを提供すると仮定するとDataSource、データソース自体がConnectionPoolDataSource(または同様の内部メカニズム)を使用してを取得しPooledConnectionます。このPooledConnectionは、データベースへの実際の物理接続を管理します。

ユーザーがデータソースからの接続を要求すると、データソースはPooledConnectionをチェックアウトし、それを要求しConnectionます。次に、PooledConnectionは、物理接続を使用またはラップする論理接続を作成します(プロキシを使用するなど)。DataSourceは、その論理接続をユーザーに返します。

ユーザーにとって、論理接続はすべての面で物理接続と同じように動作する必要があります。したがって、ユーザーが接続を閉じると、その論理接続とすべての依存JDBCオブジェクトが閉じられ、物理接続を閉じるのと同じように動作します。

JDBC 4.1セクション11.1は、次のように述べています。

接続プーリングはクライアントに対して完全に透過的です。クライアントはプールされた接続を取得し、プールされていない接続を取得して使用するのとまったく同じ方法でそれを使用します。

そしてセクション11.4:

アプリケーションが論理ハンドルを再利用しようとすると、Connection実装はSQLExceptionをスローします。

特定のPooledConnectionオブジェクトについては、最後に生成された論理接続オブジェクトのみが有効になります。関連するPooledConnection.getConnectionメソッドが呼び出されると、既存のConnectionオブジェクトは自動的に閉じられます。

ただし、バックグラウンドでは、論理接続が閉じられると、PooledConnectionは再利用可能であることをデータソースに通知し、データソースはそれを接続プールに返すか、PooledConnection(物理接続を閉じる)を閉じます。接続はもう必要ありません。

DataSourceは、PooledConnectionに論理接続を閉じるように要求することにより、ユーザーからの接続を強制的に取り消すこともできます(たとえば、接続のチェックアウトが長すぎる場合など)。

于 2012-09-22T08:11:28.213 に答える
3

connection1.close()(DriverManager.getConnection()を介して)、

これにより、データベースとすべてのリソースに対して確立された物理接続が閉じられます。結果セット、ステートメント、接続がリリースされます。そのため、接続が閉じられた後はそれらにアクセスできません。

connection2.close()(DataSource.getConnection()を介して)

これはデータソースの実装に依存するため、異なるデータソースの実装間で動​​作が一貫している必要はありません。また、特定のDataSource実装内では、接続の実際のライフサイクルは他のさまざまなパラメーターに依存するため、この接続をDriverManagerを介して取得した接続と区別しないことを強くお勧めします。

に保持されているデータをとが閉じResultSetた後に利用できるようにしたい場合は、それがユースケースに適合するかどうかを確認できます。StatementConnectionCachedRowSet

于 2012-09-22T07:16:08.100 に答える
3

クライアント側のキャッシュは、接続に使用されているドライバーに依存している可能性があります。ただし、一部のドライバーは、接続が閉じられると、ステートメントまたは結果セットを使用できないようにします。他の人はクライアント側で結果セットを維持します

于 2012-09-22T08:03:45.483 に答える