KL
Ақп. 10, 2017, 3:26 Т.Ж.

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

QSqlDataBase

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

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

14
Evgenii Legotckoi
  • Ақп. 10, 2017, 12:30 Т.Қ.

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

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

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

    KL
    • Ақп. 10, 2017, 1:46 Т.Қ.

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

      Evgenii Legotckoi
      • Ақп. 10, 2017, 2:26 Т.Қ.

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

        KL
        • Ақп. 10, 2017, 3:34 Т.Қ.

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

          Evgenii Legotckoi
          • Ақп. 10, 2017, 3:59 Т.Қ.

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

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

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

            KL
            • Ақп. 10, 2017, 4:02 Т.Қ.

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

              KL
              • Ақп. 10, 2017, 4:12 Т.Қ.

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

                Evgenii Legotckoi
                • Ақп. 10, 2017, 4:49 Т.Қ.

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

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

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

                  KL
                  • Ақп. 10, 2017, 5:05 Т.Қ.

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

                    KL
                    • Ақп. 10, 2017, 5:12 Т.Қ.

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

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

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

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

                        KL
                        • Ақп. 10, 2017, 5:44 Т.Қ.

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

                          KL
                          • Ақп. 17, 2017, 3:09 Т.Қ.
                          • Жауап шешім ретінде белгіленді.
                          #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, 2017, 3:14 Т.Қ.

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

                              Пікірлер

                              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                              Кіріңіз немесе Тіркеліңіз