Стратегия асинхронного доступа к базе данных с Qt5 SQL - PullRequest
1 голос
/ 10 января 2020

Мне нужно создать сервер в Qt C ++ с QTcpServer, который может обрабатывать столько запросов одновременно. почти более 1000 соединений, и все эти соединения будут постоянно нуждаться в использовании базы данных MariaDB

Прежде чем его можно будет развернуть на основных серверах, ему необходимо иметь возможность обрабатывать 1000 соединений с каждым соединением. Он запрашивает данные как можно быстрее на 4-ядерном процессоре 1 ГГц с 2 ГБ ОЗУ виртуальной машины Ubuntu, работающей в облаке. База данных MySQL размещена на каком-то другом сервере, более мощном

Так как же это реализовать? после поисков я нашел следующие варианты

1. Создать новый QThread для каждого SQL Запрос

2. Используйте QThreadPool для нового SQL Query

Для первого из них он может создать столько потоков и замедлить системную причину такого количества переключений контекста.

Для второго после Пул заполнен, другие соединения должны ждать, пока MariaDB выполняет свою работу. Так что же является лучшей стратегией?

Ответы [ 2 ]

1 голос
/ 10 января 2020

Извините за плохой английский sh.

1) Исключить.

2) Исключить.

3) Здесь сначала всегда делают работу qt. Да, соединения (задачи для соединений) должны ждать доступных потоков, но вы легко можете добавить 10000 задач в пул потоков qt. Если хотите, настройте максимальное количество потоков в пуле, время ожидания для задач и другое. Конечно, вы должны синхронизировать c совместно используемые данные различных потоков с семафором / futex / mutex и / или атомами.

Mysql (maria) - это сервер, и этот сервер может одновременно принимать множество соединений. Это поведение в равной степени, что вы хотите для вашего приложения QT. И mysql это просто бэкэнд с данными для вашего приложения.

Итак, ваше приложение это сервер. Для простоты вы должны прослушивать сокет для новых соединений и сохранять эти клиентские соединения в vector / array и работать с каждым клиентским соединением. Всегда, когда вам что-то нужно (получить данные из mysql бэкэнда для клиента (да, с новым, отдельным для каждого клиента, подключенным отложенным подключением к mysql), считывать / записывать данные из / в клиента, закрывать соединение и т.д. c.) - вы создаете новое задание и добавляете его в пул потоков.

Это очень простое объяснение, но надеюсь, что я вам помог.

0 голосов
/ 10 января 2020

Рассмотрим раздел my.cnf [mysqld]

thread_handling=pool-of-threads

Удачи.

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