Является ли поток MySQL Connector/JDBC безопасным?

Является ли стандартный драйвер MySQL JDBC потокобезопасным? В частности, я хочу использовать одно соединение для всех потоков, но каждый оператор будет использоваться только в одном потоке. Существуют ли определенные сценарии, которые безопасны, а другие - нет? Каков ваш опыт здесь?

Ответы

Ответ 1

Транзакции запускаются/фиксируются для каждого соединения. Если вы не делаете какие-то очень специфические вещи (я не могу представить себе пример, где это было бы оправдано, если честно), вам будет лучше с пулом соединений и подключением на поток.

Ответ 2

Если autocommit = 1, то очень возможно, чтобы несколько потоков имели одно и то же соединение при условии, что доступ к соединению синхронизирован. Если autocommit = 0, вам нужно будет контролировать доступ к соединению через какой-либо мьютекс до тех пор, пока не произойдет фиксация.

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

Ответ 3

Основываясь на моем недавнем опыте, объект Connection не является потокобезопасным в Connector/J 5.1.33.

Я столкнулся с ситуацией взаимоблокировки, описанной в ошибка 67760. Не уверен, что это ошибка, но один разумный совет из обсуждения:

[12 Дек. 2012 20:33] Тодд Фермер

Пожалуйста, не используйте один объект Connection для нескольких потоков без надлежащей синхронизации. Коннектор /J - и что более важно, протокол клиент-сервер MySQL - не допускает одновременных операции с использованием одного и того же объекта Connection. Если объект Connection должны делиться между потоками, ответственность автор кода приложения для обеспечения правильной сериализации операций.