Михаиллл
7 июня 2020 г. 18:54

Как в QtWebApp правильно подключаться к базе

Добрый день.
Делаю на QtWebApp сервер. Сделал класс DataBase для работы с базой.
Если открывать соединение с базой в классе RequestHandler в конструкторе, то при ображение к базе в функции

  1. void RequestHandler::service(HttpRequest& request, HttpResponse& response)

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

  1. 07.06.2020 15:36:44.134 1 WARNING 0x20d4 QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

Скажите пожалуйста как и где создать объект класса DataBase и открыть его, что бы все работало?

3

Вам это нравится? Поделитесь в социальных сетях!

8
Evgenii Legotckoi
  • 7 июня 2020 г. 23:13

Добрый день.
Я бы сделал подключение к базе данных при старте приложения, а запросы уже отдельно делал.
Но уж точно не в методе RequestHandler::service, ведь судя по его названию, он обрабатывает запросы, а не отвечает за первоначальную инициализацию.

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

    Михаиллл
    • 7 июня 2020 г. 23:56

    Если при старте, то получается так, база не конектится и в 1 строке пишет ошибку, при подключениях клиента к серверу выдает ошибки о не подключеной базе.

      Михаиллл
      • 8 июня 2020 г. 15:48

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

      1. dataBase = QSqlDatabase::addDatabase("QPSQL", "conectionName");
      2. dataBase.setDatabaseName("db_game_tamada");
      3. dataBase.setUserName("postgres");
      4. dataBase.setPassword("1qaz");
      5. dataBase.setPort(5433);//*/
      6. if (dataBase.open()) {
      7. //out<<"db is opened \r\n";
      8. }
      9. else {
      10. //out<<"db not opened \r\n";
      11. }
        Михаиллл
        • 9 июня 2020 г. 0:43
        • Ответ был помечен как решение.

        Нужно задавать уникально имя подключению базы

        1. dataBase = QSqlDatabase::addDatabase("QPSQL", "conectionName");
        2. dataBase.setDatabaseName("db_game_tamada");
        3. dataBase.setUserName("postgres");
        4. dataBase.setPassword("1qaz");
        5. //ResumeDB.setHostName("127.0.0.1");
        6. dataBase.setPort(5433);//*/

        А потом в запросе указывать эту базу

        1. QSqlQuery query(dataBase);

        осталось понять как делать уникальные имена

          Evgenii Legotckoi
          • 9 июня 2020 г. 11:28

          добавляйте к имени текущее время.

          1. QString dataBaseName = QString("db_game_tamada_%1").arg(QDateTime::currentDateTime());
            Михаиллл
            • 9 июня 2020 г. 11:37

            Я решил добавлять тип запроса + уникальный номер запрашиваюшего устройства + 2 рандомных числа от 0 до 999999, так скорей всего будет уникально, даже если запросы последуют однавременно.

              Evgenii Legotckoi
              • 9 июня 2020 г. 11:53
              • (ред.)

              А со временем до милисекунд гарантировано будет уникально :-)

                R
                • 14 июня 2020 г. 23:17

                Краще всетаки до бази конектитись при старті, не рекомендувавби вам на кожен запит створювати конекшин, так як сервер баз даних може мати лімінт на кількість сесій, і і не рекомендувавби вішати всіх на один конекшин, так як там теж є ліміти, оптимальний варіант для себе, і доречі схожа рекомендація була на стековефло, це декілька конекшинів які видаютсья по черзі на нову сесію (ну це в мому випадку так як в мене клієнт конектиться по websocket)
                час до мілісекунд теж не найкращий варіант бо може бути конфлікт, і я на це декілька разів попадав тому використовую щось типу

                1. QSqlDatabase dbServerGlobal;
                2. QString m_name_connect = QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz") + QVariant(QRandomGenerator::global()->generate()).toString();
                3. if(!dbServerGlobal.contains(m_name_connect))
                4. {
                5. // перевіряєм чи вже є з такою назвою
                6. }

                видаляти доречі можна по

                1. QSqlDatabase::removeDatabase(name_connect);

                при запуску програми є функція типу

                1. static QStringList listConnection;
                2.  
                3. void dataBaseConnect::loadConnectionList()
                4. {
                5. int number_connection = 10;
                6. listConnection.clear();
                7. for(int i = 0; i < number_connection; i++)
                8. {
                9. QString name_conn = QString("con_%1").arg(i);
                10.  
                11.  
                12. listConnection.append(name_conn);
                13.  
                14. }
                15. }

                а потім при конекті клієнта по черзі по кругу видаєтсья їм назва

                1. QString dataBaseConnect::getUserConnection()
                2. {
                3. if((listConnection.size() - 1) == indexLastConnection)
                4. {
                5. indexLastConnection = 0;
                6. }
                7.  
                8. QString ret = listConnection.at(indexLastConnection);
                9.  
                10. indexLastConnection++;
                11. return ret;
                12.  
                13. }

                ну f корbстувач вже використовує при запиті

                1. QSqlQuery m_query(QSqlDatabase::database(m_user->nameConnectDb()));

                доречі в цьому впадку потрібно переконатись що сервер не закриваю конекти по таймауту

                  Комментарии

                  Только авторизованные пользователи могут публиковать комментарии.
                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                  • Последние комментарии
                  • Evgenii Legotckoi
                    16 апреля 2025 г. 17:08
                    Благодарю за отзыв. И вам желаю всяческих успехов!
                  • IscanderChe
                    12 апреля 2025 г. 17:12
                    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                  • AK
                    1 апреля 2025 г. 11:41
                    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                  • Evgenii Legotckoi
                    9 марта 2025 г. 21:02
                    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                  • VP
                    9 марта 2025 г. 16:14
                    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…