Безопасен ли поток MySQL Connector / JDBC?
-
06-07-2019 - |
Вопрос
Является ли стандартный драйвер MySQL JDBC поточно-ориентированным? В частности, я хочу использовать одно соединение для всех потоков, но каждый оператор будет использоваться только в одном потоке. Существуют ли определенные сценарии, которые являются безопасными, а другие - нет? Какой у вас опыт здесь?
Решение
Транзакции запускаются / фиксируются для каждого соединения. Если вы не делаете какие-то очень специфические вещи (я не могу придумать пример, где это было бы оправдано, если честно), вам лучше иметь пул соединений и соединение на поток.
Другие советы
Если autocommit = 1, то очень возможно, чтобы несколько потоков совместно использовали одно и то же соединение, при условии, что доступ к соединению синхронизирован. Если autocommit = 0, вам придется контролировать доступ к соединению через какой-то мьютекс, пока не произойдет фиксация. Р>
Если вы абсолютно не ограничены в количестве соединений, которые может иметь ваше приложение, пул соединений может быть более жизнеспособной альтернативой.
Исходя из моего недавнего опыта, объект Connection
не является поточно-ориентированным в Connector / J 5.1.33.
Я попал в тупиковую ситуацию, описанную в ошибке 67760 . Не уверен, что это ошибка, но один разумный совет из обсуждения был:
[12 декабря 2012 20:33] Тодд Фармер
Пожалуйста, не используйте один объект Connection в нескольких потоках без правильной синхронизации. Разъем / J - и что более важно, клиент-серверный протокол MySQL - не допускает одновременного операции с использованием одного и того же объекта Connection. Если объект подключения должны быть разделены между потоками, это ответственность автор кода приложения для обеспечения правильной сериализации операций.