Управление базой данных и временем жизни соединения


В Qt есть несколько шагов, которые должны быть завершены, пока доступ к базе данных не будет выполнен.

Самым первым шагом является добавление базы данных по имени соединения:

QSqlDatabase::addDatabase("QMYSQL", connectionName);

После этого я могу использовать open() и close() для открытия/закрытия соответствующего соединения.

Эту базу данных также можно удалить с помощью следующего вызова:

QSqlDatabase::removeDatabase(connectionName);

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

Мне кажется очевидным, что это плохая идея, чтобы держать соединения открытыми все время из-за возможных сетевых проблем и ограниченных соединений на стороне сервера.

Однако как насчет addDatabase()? Есть ли какой-то вред или польза в призвании addDatabase() Без вызова removeDatabase() непосредственно после (но только при выходе из приложения)? Или лучше все время напрямую связывать эти вызовы?

1 2

1 ответ:

Мы можем прочитать из документации Qt о QSqlDatabase:

Предупреждение: если вы добавляете соединение с тем же именем, что и существующее соединение, новое соединение заменяет старое. Если вы называете это функция более чем один раз без указания параметра connectionname, по умолчанию соединение будет заменено.

Поэтому, когда вы добавляете базу данных несколько раз в пределах определенного имени или без указания какого-либо (соединение по умолчанию), соединение заменяется и нет, чтобы позвонить removeDatabase.

Но я думаю, что вы должны вызвать QSqlDatabase::addDatabase() один раз, когда ваше приложение запускается для каждой возможной базы данных, и нет необходимости добавлять, а затем удалять соединение каждый раз, когда вы хотите получить доступ к нему в разных частях.

QSqlDatabase::addDatabase просто назначает имя соединения для соответствующего драйвера SQL и возвращаемого объекта QSqlDatabase. База данных открыта только при вызове QSqlDatabase::open. Поэтому, когда вы добавляете базу данных в разных местах, где она используется, все QSqlDatabase объекты, использующие одно и то же имя соединения, изменяются. Таким образом, вы можете иметь много накладных расходов, если используете много объектов QSqlDatabase с одинаковым именем соединения.

В разных частях кода Вы можете использовать QSqlDatabase::database, который возвращает соединение с базой данных под названием connectionName. Таким образом, вы можете получить доступ к экземпляру QSqlDatabase в разных частях, где вы фактически вызвали addDatabase один раз в начале.