Многопоточный доступ к MySQL с использованием ADO.Net - PullRequest
2 голосов
/ 05 октября 2009

Я занимаюсь разработкой веб-приложения ASP.Net, которое использует MySQL через MySQL-Provided Connector / NET, который является ADO.Net-совместимым интерфейсом. Насколько я понимаю, ASP.Net заключается в том, что параллельные запросы будут обрабатываться в отдельных потоках, поэтому мой код должен быть поточно-ориентированным.

Я не могу найти в документации MySQL ничего, что бы однозначно объясняло, как использовать API в поточно-ориентированном режиме. Документация по MySqlCommand гласит:

Открытые статические (Shared в Visual Basic) члены этого типа безопасны для многопоточных операций. Члены экземпляра не гарантируют поточнобезопасность

Мое буквальное понимание этого состоит в том, что безопасно разделять объект соединения между потоками, при условии, что я не вызываю нестатические методы одновременно. Другими словами, я должен быть в состоянии сделать:

IDbConnection myConnection = GetSomeConnection(); // Returns a shared object
IDbCommand cmd;

lock(myConnection)
{
    cmd = myConnection.CreateCommand();
}

// Some code using cmd

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

Если это небезопасно, рекомендуется ли использовать локальные потоки соединения или мне следует реализовать какой-либо пул соединений?

Ответы [ 3 ]

1 голос
/ 05 октября 2009

Использование оператора может помочь вам:

using(IDbConnection myConnection = GetSomeConnection()){  
   IDbCommand cmd = myConnection.CreateCommand();  
}

Соединение будет удалено автоматически и вернется в пул соединений.

1 голос
/ 05 октября 2009

Используйте IDbConnection именно тогда, когда вам это нужно, и утилизируйте его, как только вы закончите с вашими SQL-запросами. Соединение вернется в пул соединений и будет использовано другим потоком при следующем открытии соединения с той же строкой соединения, даже если это другой поток. Нет необходимости делать здесь какие-либо блокировки.

0 голосов
/ 05 октября 2009

Не делитесь своими связями между потоками. Сохраняйте ваши объекты подключения локальными, открывайте их как можно позже и закрывайте их как можно раньше (желательно с блоком using).

using (MySqlConnection conn = new MySqlConnection("..."))
{
    // do work
}

Насколько я знаю, MySql Connector поддерживает пул соединений и включен по умолчанию, так что пусть Connector беспокоится об управлении пулом соединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...