はい、通常、スレッドごとに新しい接続を作成する必要があります。オペレーティングシステムがスレッドの実行をタイムスライスする方法を制御できないため(独自のクリティカルセクションを定義しているにもかかわらず)、誤って複数のスレッドがその1つのパイプにデータを送信しようとする可能性があります。
同じことがすべてのネットワーク通信にも当てはまることに注意してください。たとえば、2つのスレッドが1つのソケットをHTTP接続と共有しようとしている場合。
- スレッド1がリクエストを行います
- スレッド2がリクエストを行います
- スレッド1はソケットからバイトを読み取り、無意識のうちにスレッド2の要求からの応答を読み取ります
すべてのトランザクションをクリティカルセクションでラップし、開始/コミットサイクル全体で他のスレッドをロックアウトすると、スレッド間でデータベース接続を共有できる可能性があります。しかし、JDBCプロトコルの本質的な知識がない限り、それでもそうはしません。
ほとんどのスレッドでデータベース接続の必要性が低い(またはまったく必要ない)場合は、データベース作業を行うために1つのスレッドを指定し、他のスレッドにその1つのスレッドへの要求をキューに入れることができる場合があります。これにより、非常に多くの接続のオーバーヘッドが削減されます。ただし、環境内のスレッドごとの接続を管理する方法を理解する必要があります(または、StackOverflowでそれについて別の具体的な質問をする必要があります)。
更新: コメントでの質問に答えるために、ほとんどのデータベースブランドは、単一の接続での複数の同時トランザクションをサポートしていません(InterBase / Firebirdは私が知っている唯一の例外です)。
個別のトランザクションオブジェクトがあり、接続ごとに複数のトランザクションを開始およびコミットできると便利です。しかし、ベンダーは単にそれをサポートしていません。
同様に、JDBCやODBCなどの標準的なベンダーに依存しないAPIは、トランザクション状態が単に接続オブジェクトのプロパティであるという同じ仮定をします。