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