Это java.язык SQL.Соединение потокобезопасно?


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

5 53

5 ответов:

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

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

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

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

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

и

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

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

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

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

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

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

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

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

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