Как получить доступ к MySQL от нескольких потоков одновременно

jQuery имеет набор плагинов, которые расширяют базовую функциональность. Существует этот плагин для легких пространств имен.

21
задан Isak Savo 11 July 2013 в 01:36
поделиться

4 ответа

Как сопровождающий довольно большого приложения на C, которое выполняет вызовы MySQL из нескольких потоков, я могу сказать, что у меня не было проблем с простым установлением нового соединения в каждом потоке. Некоторые предостережения, с которыми я столкнулся:

  • Изменить: похоже, этот пункт применим только к версиям <5.5; см. эту страницу для соответствующей версии : Как вы говорите, вы уже делаете ссылку на libmysqlclient_r .
  • Вызов mysql_library_init () ( один раз из main () ). Прочтите документацию об использовании в многопоточных средах, чтобы понять, почему это необходимо.
  • Создайте новую структуру MYSQL , используя mysql_init () в каждом потоке. Это имеет побочный эффект вызова mysql_thread_init () для вас. mysql_real_connect () , как обычно, внутри каждого потока, с его зависящей от потока структурой MYSQL.
  • Если вы создаете / уничтожаете множество потоков, вы захотите использовать mysql_thread_end () в конце каждого потока (и mysql_library_end () в конце main () ). В любом случае это хорошая практика.

В принципе, не делитесь структурами MYSQL или чем-либо, созданным специально для этой структуры (например, MYSQL_STMT s), и все будет работать так, как вы ожидаете.

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

Я захочу использовать mysql_thread_end () в конце каждого потока (и mysql_library_end () в конце main () ). В любом случае это хорошая практика.

По сути, не делитесь структурами MYSQL или чем-либо, созданным специально для этой структуры (например, MYSQL_STMT s), и все будет работать так, как вы ожидаете.

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

я захочу использовать mysql_thread_end () в конце каждого потока (и mysql_library_end () в конце main () ). В любом случае это хорошая практика.

В принципе, не делитесь структурами MYSQL или чем-либо, созданным специально для этой структуры (например, MYSQL_STMT s), и все будет работать так, как вы ожидаете.

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

26
ответ дан 29 November 2019 в 21:17
поделиться

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

Здесь есть статья , описывающая плюсы и минусы пула соединений (хотя она основана на java. )

Edit: Вот вопрос / ответ SO о пулах соединений в C

Edit2: Вот ссылка на образец Connection Pool для MySQL , написанный на C ++. (вам, вероятно, следует игнорировать операторы goto, когда вы реализуете свои собственные.)

6
ответ дан 29 November 2019 в 21:17
поделиться

Из документации mySQL мне кажется очевидным, что любую конкретную структуру MYSQL можно без труда использовать в потоке - используя ту же структуру MYSQL в разных потоках одновременно явно даст вам крайне непредсказуемые результаты, поскольку состояние хранится в соединении MYSQL.

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

1
ответ дан 29 November 2019 в 21:17
поделиться

MySQL Threaded Clients in C

It states that mysql_real_connect() is not thread safe by default. The client library needs to be compiled for threaded access.

-1
ответ дан 29 November 2019 в 21:17
поделиться