Java Concurrency in Practiceの最初の部分を読んだ後、列挙型ベースのシングルトンCRUD
を使用する plain を使用する小さなアプリケーションに取り組んでいます。スレッドセーフなコードを記述するアプローチが気に入りました。私の質問は次のとおりです。JDBC
Connection
ThreadLocal
考慮されたグッドプラクティスでグローバルJDBC
接続をラップするときは?ThreadLocal
Java Concurrency in Practiceの最初の部分を読んだ後、列挙型ベースのシングルトンCRUD
を使用する plain を使用する小さなアプリケーションに取り組んでいます。スレッドセーフなコードを記述するアプローチが気に入りました。私の質問は次のとおりです。JDBC
Connection
ThreadLocal
考慮されたグッドプラクティスでグローバルJDBC
接続をラップするときは?ThreadLocal
ThreadLocal でグローバル JDBC 接続をラップすることをお勧めしますか?
詳細に大きく依存します。多数のスレッドがある場合、それらのそれぞれが独自の接続を開くため、非常に困難な場合があります。次に、スレッドが休止状態になるため、接続が停滞します。
再入可能な接続プールを使用することをお勧めします。次に、すでに開いているが現在使用されていない接続を再利用できますが、接続の数を同時に作業するために必要な最小限に制限します。 Apache の DBCPは良い例であり、よく考えられています。
ドキュメントから引用するには:
ユーザーごとに新しい接続を作成すると、数ミリ秒かかる可能性があるデータベース トランザクションを実行するために、時間がかかる場合があります (多くの場合、数秒のクロック時間が必要です)。ユーザーごとに接続を開くことは、同時ユーザー数が非常に多い可能性がある公的にホストされたインターネット アプリケーションでは実行できない場合があります。したがって、開発者は、アプリケーションの現在のすべてのユーザー間で開いている接続の「プール」を共有したいと考えることがよくあります。任意の時点で実際にリクエストを実行しているユーザーの数は、通常、アクティブなユーザーの総数のごく一部であり、データベース接続が必要になるのはリクエストの処理中だけです。