Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

Исходя из моего недавнего опыта, объект Connection не является поточно-ориентированным в Connector / J 5.1.33.

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

  

[12 декабря 2012 20:33] Тодд Фармер

     

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top