Как на C# реализовать многопоточное управление MySQL?
Пишу сейчас многопоточный сервер, использовал MySql.Data.MySqlClient, но столкнулся с проблемой.
На в одну БД можно слать 1 запрос одновременно и держать 1 соединение и при том читать результат запроса можно только в открытом соединении.
В запросах и SELECT и INSERT, в зависимости от данных которые клиент прислал.
В таком тупике я оказался, как быть в такой ситуации?
@IzeBerg вам нужно организовать слой абстракции таким образом, что бы клиенскому коду казалось что он работает с одним соединением (желательно сделать методы асинхронными).
Как только клиенский код запрашивает результат какого-то запроса, этот запрос попадает в очередь компонента. Далее компонент постоянно проверяет наличие свободных соединений и отправляет в них запрос из очереди. Можно это делать по освобождению одного из соединений или в момент поступления нового запроса перед добавлением его в очередь проверять, есть ли у нас свободное соединение и только если его не нашлось - пихать в очередь.
Как только какое-то соединение вернуло результат, мы отдаем его в закрепленный за этим запросом обработчик (если честно не в курсе как это реализуется в .NET, давно на нем не писал и уж тем-более ничего подобного не делал). и переходим к нашей очереди запросов.
Примеров реализации именно под .NET подсказать не могу. На github лежит несколько реализаций на Java, которые могут что-то подсказать.
Ну принцип я понял, но как реализовать не понимаю. Беда в том, что данные из запроса можно взять только пока соединение, через которое отправлен запрос активно, т.е. как только я закрываю соединение из обработчика уже ничего не вытянуть.
@IzeBerg я думаю вам нужно сначала разобраться с этой ошибкой, ибо такое поведение неправильное. Как минимум потому что накладные расходы на установление соединения все-таки довольно велики.
@IzeBerg ну... так вы ничего про ошибку не писали. А так поведение описанное вами вполне нормальное. Алгоритм простой: открываем соединение, посылаем запрос, нам возвращается курсор (не результат), считываем результат и отдаем ему кто просил, освобождаем курсор (закрываем DataReader), можем переходить к новому запросу.