KL
Konstantin Lazarev9. Februar 2017 16:26

Работа с базами данных

QSqlDataBase

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

14
Evgenii Legotckoi
  • 10. Februar 2017 01:30

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

А при завершении программы соединение само должно отключаться корректно.

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

    KL
    • 10. Februar 2017 02:46

    Я перенес свою базу данных на сайт beget.com Там наблюдается та же проблема. Первые 3-5 минут работает хорошо. После чего нужен коннект. Написал им в службу поддержки. Жду ответ.

      Evgenii Legotckoi
      • 10. Februar 2017 03:26

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

        KL
        • 10. Februar 2017 04:34

        Здравствуйте. В целях безопасности, на MySQL серверах установлено ограничение на время ожидания. При подключении к серверу MySQL можно увеличить время ожидания командой: set session wait_timeout=600; Обратите внимание, что подключение к базе данных не должно быть постоянно открытым, а должно устанавливаться только при обмене данными. Письмо от администрации сервера.

          Evgenii Legotckoi
          • 10. Februar 2017 04:59

          Ну что могу сказать. Так-то логично.

          Обмен данными может быть в течение 10-15 секунд. А потом может быть длительный простой, просто не на каждый же чих открывать и закрывать соединение. Как вариант, можно проверять периодически с помощью запроса SELECT 1 из какой-нибудь таблицы, есть ли подключение. Если выполняется с ошибкой, то переоткрывать соединение.

          Либо просто при неудачном рабочем запросе пытаться переподключить соединение.

            KL
            • 10. Februar 2017 05:02

            set session wait_timeout=600; этот параметр я не могу изменить при помощи программы QT?

              KL
              • 10. Februar 2017 05:12

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

                Evgenii Legotckoi
                • 10. Februar 2017 05:49

                Да в общем-то можно. Это же SQL запрос тоже. Попробуйте через QSqlQuery.

                QSqlQuery query;
                query.prepare("SET SESSION wait_timeout = 600;");
                query.exec();
                

                Только всё равно нужно учитывать возможность сброса подключения со стороны сервера.

                  KL
                  • 10. Februar 2017 06:05

                  Я понял. Спасибо Вам, перейду к реализации выше изложенного.

                    KL
                    • 10. Februar 2017 06:12

                    Последний вопрос)

                    QSqlQuery query;
                    query.prepare("SET SESSION wait_timeout = 600;");
                    query.exec();
                    
                    Необходимо отправлять перед каждым обращением или можно время задать (час например) вначале соединения и больше не прописывать его?
                      Evgenii Legotckoi
                      • 10. Februar 2017 06:26

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

                      Так что, если Вы пользуетесь бесплатным виртуальным хостингом, то скорее всего покрутить конфигурационный файл не удастся. Да и судя по ответу, что Вы привели выше - это так и есть.

                        KL
                        • 10. Februar 2017 06:44

                        Проблема решена. Базы данных работают адекватно. Я увеличил время сессии на час. Для меня этого вполне достаточно.

                          KL
                          • 17. Februar 2017 04:09
                          • Die Antwort wurde als Lösung markiert.
                          #include "db.h"
                          #include <QSqlQuery>
                          #include <QDebug>
                          #include <QSqlQuery>
                          void db::Connect()
                          {
                          
                              if(QSqlDatabase::contains(QSqlDatabase::defaultConnection))
                              {
                                DB=QSqlDatabase::database();
                              }
                              else
                              {
                              DB=QSqlDatabase::addDatabase("QMYSQL");
                              DB.setPassword("*********");
                              DB.setHostName("*********.beget.tech");
                              DB.setDatabaseName("*********_comment");
                              DB.setUserName("*********_comment");
                              if (!DB.open())
                              {qDebug() << "Failed to connect to root mysql admin";}
                              else
                              {
                                  qDebug()<<"cool";
                              }
                              QSqlQuery query;
                              query.prepare("SET SESSION wait_timeout = 36000;");
                              query.exec();
                              }
                          }
                          
                          db::db()
                          {
                          
                          }
                          
                          QStringList db::SaytPage()
                          {
                              Connect();
                              QStringList List;
                              QString str;
                              List.clear();
                              QSqlQuery query(DB);
                             query.exec("SELECT namepage FROM page");
                              while(query.next())
                              {
                                 str=query.value(0).toString();
                                 List.push_back(str);
                              }
                              DB.close();
                              DB.removeDatabase("*********_comment");
                              return List;
                          }
                          
                            KL
                            • 17. Februar 2017 04:14

                            Приложение работает без предупреждений. Отредактируйте пожалуйста пароли)

                              Kommentare

                              Nur autorisierte Benutzer können Kommentare posten.
                              Bitte Anmelden oder Registrieren
                              Letzte Kommentare
                              ИМ
                              Игорь Максимов5. Oktober 2024 07:51
                              Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                              d
                              dblas55. Juli 2024 11:02
                              QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                              k
                              kmssr8. Februar 2024 18:43
                              Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                              Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                              EVA
                              EVA25. Dezember 2023 10:30
                              Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                              Jetzt im Forum diskutieren
                              J
                              JacobFib17. Oktober 2024 03:27
                              добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                              JW
                              Jhon Wick1. Oktober 2024 15:52
                              Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                              КГ
                              Кирилл Гусарев27. September 2024 09:09
                              Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                              F
                              Fynjy22. Juli 2024 04:15
                              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                              Folgen Sie uns in sozialen Netzwerken