Да, в общем случае вам нужно создать новое соединение для каждого потока. У вас нет контроля над тем, как операционная система синхронизирует выполнение потоков по времени (несмотря на определение ваших собственных критических секций), поэтому вы можете непреднамеренно создать несколько потоков, пытающихся отправить данные по одному каналу.
Обратите внимание, что то же самое относится к любым сетевым коммуникациям. Например, если у вас два потока, пытающихся использовать один сокет для HTTP-соединения.
- Тема 1 делает запрос
- Тема 2 делает запрос
- Поток 1 читает байты из сокета, невольно читая ответ от запроса потока 2
Если вы обернули все свои транзакции в критические секции и, следовательно, заблокировали все другие потоки на весь цикл начала / принятия, то вы могли бы разделить соединение с базой данных между потоками. Но я бы не стал этого делать даже тогда, если вы не обладаете врожденными знаниями о протоколе JDBC.
Если у большинства ваших потоков есть нечастые потребности в соединениях с базой данных (или вообще не нужны), вы можете назначить один поток для работы с вашей базой данных, а другие потоки ставят свои запросы в один поток. Это уменьшит накладные расходы на такое количество соединений. Но вам придется выяснить, как управлять соединениями для каждого потока в вашей среде (или задать другой конкретный вопрос об этом в StackOverflow).
обновление: Чтобы ответить на ваш вопрос в комментарии, большинство брендов баз данных не поддерживают несколько одновременных транзакций для одного соединения (InterBase / Firebird - единственное исключение, о котором я знаю).
Было бы неплохо иметь отдельный объект транзакции и иметь возможность запускать и фиксировать несколько транзакций для одного соединения. Но производители просто не поддерживают это.
Аналогичным образом, стандартные независимые от поставщика API, такие как JDBC и ODBC, предполагают, что состояние транзакции является просто свойством объекта соединения.