Является ли java.sql.Connection потоком безопасно? - PullRequest
60 голосов
/ 07 октября 2009

Перефразируя вопрос: следует ли мне избегать совместного использования экземпляров классов, которые реализуют java.sql.Connection, между различными потоками?

Ответы [ 5 ]

65 голосов
/ 07 октября 2009

Если драйвер JDBC соответствует спецификациям, то технически да, объект является поточно-ориентированным, но вам следует избегать совместного использования соединений между потоками, поскольку активность в соединении будет означать, что только один поток сможет что-либо делать за один раз.

Вы должны использовать пул соединений (например, Apache Commons DBCP ), чтобы каждый поток получал свое собственное соединение.

11 голосов
/ 07 октября 2009

java.sql.Connection - это интерфейс. Итак, все зависит от реализации драйвера, но в целом следует избегать совместного использования одного и того же соединения между различными потоками и использования пулов соединений. Также рекомендуется, чтобы количество подключений в пуле превышало количество рабочих потоков.

4 голосов
/ 31 января 2018

Это довольно старая тема, но для тех, кто ищет ответ относительно Microsoft SQL Server, вот ответ:

SQLServerConnection не является потокобезопасным, однако несколько операторов, созданных из одного соединения, могут обрабатываться одновременно в параллельных потоках.

и

SQLServerConnection реализует соединение JDBC с SQL Server.

Из всего вышесказанного вы можете делиться операторами, но не Connections, и в случае, если вам нужно соединение в каждом потоке, вы можете использовать пул потоков.

Подробнее здесь

2 голосов
/ 20 июля 2018

Oracle JDBC и многопоточность документы:

Поскольку все методы API Oracle JDBC синхронизированы, если два потока пытаются одновременно использовать объект подключения, один будет вынужден ждать, пока другой не завершит свое использование.

Так что в случае Oracle это может быть безопасно, но параллельный доступ может пострадать от узкого места.

1 голос
/ 29 сентября 2017

У нас было ArrayOutOfBoundsException в кэше операторов Websphere его пулированного источника данных, и нам пришлось отключить этот кэш.

У нас было лечение, которое блокировало себя.

Все это из-за текущего доступа к соединению, поэтому вывод из реальной практики таков, что вы не должны этого делать.

...