Управление базой данных и временем жизни соединения
В Qt есть несколько шагов, которые должны быть завершены, пока доступ к базе данных не будет выполнен.
Самым первым шагом является добавление базы данных по имени соединения:
QSqlDatabase::addDatabase("QMYSQL", connectionName);
После этого я могу использовать open()
и close()
для открытия/закрытия соответствующего соединения.
Эту базу данных также можно удалить с помощью следующего вызова:
QSqlDatabase::removeDatabase(connectionName);
Мое приложение делает это много, так как оно обращается к различным базам данных в параллельных процессах для многих целей. Также это сервер приложение, которое работает очень долго без перезапуска.
Мне кажется очевидным, что это плохая идея, чтобы держать соединения открытыми все время из-за возможных сетевых проблем и ограниченных соединений на стороне сервера.
Однако как насчет addDatabase()
? Есть ли какой-то вред или польза в призвании addDatabase()
Без вызова removeDatabase()
непосредственно после (но только при выходе из приложения)? Или лучше все время напрямую связывать эти вызовы?
1 ответ:
Мы можем прочитать из документации Qt о
QSqlDatabase
:Предупреждение: если вы добавляете соединение с тем же именем, что и существующее соединение, новое соединение заменяет старое. Если вы называете это функция более чем один раз без указания параметра connectionname, по умолчанию соединение будет заменено.
Поэтому, когда вы добавляете базу данных несколько раз в пределах определенного имени или без указания какого-либо (соединение по умолчанию), соединение заменяется и нет, чтобы позвонить
Но я думаю, что вы должны вызватьremoveDatabase
.QSqlDatabase::addDatabase()
один раз, когда ваше приложение запускается для каждой возможной базы данных, и нет необходимости добавлять, а затем удалять соединение каждый раз, когда вы хотите получить доступ к нему в разных частях.
QSqlDatabase::addDatabase
просто назначает имя соединения для соответствующего драйвера SQL и возвращаемого объектаQSqlDatabase
. База данных открыта только при вызовеQSqlDatabase::open
. Поэтому, когда вы добавляете базу данных в разных местах, где она используется, всеQSqlDatabase
объекты, использующие одно и то же имя соединения, изменяются. Таким образом, вы можете иметь много накладных расходов, если используете много объектовQSqlDatabase
с одинаковым именем соединения.В разных частях кода Вы можете использовать
QSqlDatabase::database
, который возвращает соединение с базой данных под названиемconnectionName
. Таким образом, вы можете получить доступ к экземпляруQSqlDatabase
в разных частях, где вы фактически вызвалиaddDatabase
один раз в начале.