2

在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的數據庫連接。通過這種方式,您可以在開始時實際調用addDatabase的不同部分訪問QSqlDatabase實例。

+0

目前,如果使用contains()之前添加了連接名稱,我不會調用addDatabase()。所以我可以防止連接被不必要地替換。 – Silicomancer 2014-12-04 07:07:09

+0

你是否知道在每次訪問之前/之後調用addDatabase()/ removeDatabase()時可以花費多少代價(從很多不必要的代碼行開始)? – Silicomancer 2014-12-04 07:07:31

+3

@Silicomancer如果您使用許多具有相同連接名稱的'QSqlDatabase'對象,那麼如果在每個使用的部分中添加數據庫,則可能會產生大量開銷。這是因爲當您調用addDatabase時,所有使用相同連接名稱的'QSqlDatabase'對象都會更改。我更新了答案。 – Nejat 2014-12-04 07:21:27