Является ли поток 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 должны делиться между потоками, ответственность автор кода приложения для обеспечения правильной сериализации операций.