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