2

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

Самый первый шаг, чтобы добавить базу данных по имени соединения:

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

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

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

QSqlDatabase::removeDatabase(connectionName); 

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

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

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

ответ

1

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

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

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

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

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

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

+0

В настоящее время я не называю addDatabase(), если имя соединения было добавлено до этого с помощью contains(). Поэтому я могу предотвратить ненужное замену соединения. – Silicomancer

+0

Знаете ли вы, насколько дорогостоящий addDatabase()/removeDatabase() может быть вызван до/после каждого доступа (appart из множества ненужных строк кода)? – Silicomancer

+3

@Silicomancer Если вы используете много объектов 'QSqlDatabase' с тем же именем соединения, у вас может быть много накладных расходов, если вы добавляете базу данных в каждую используемую часть. Это потому, что все объекты 'QSqlDatabase', которые используют одно и то же имя соединения, изменяются при вызове' addDatabase'. Я обновил ответ. – Nejat

Смежные вопросы