QT下链接SQLServer2012数据库异常处理记录

问题描述:   多线程程序中创建数据库实例后,链接数据库正常,但接着使用该实例执行sql语句时发现链接断开,数据库处于关闭状态


尝试解决方法:

 1.  单线程程序,使用QT新建demo进行测试,模拟上述现象恢复现场,发现并不存在在上述现象。 由此可以排除程序问题

 2.  更换数据库,使用mysql进行重新连接,连接正常,并不存在上述现象,排除程序逻辑异常的可能性

 3.  本机上安装了SqlServer2005和SqlServer2012两个版本,是否出现数据库连接池冲突的问题。  通过问题排查,

     QT在每个线程内使用的sqldatabase实例是唯一的,只在该线程内有效,因此可以排除线程之间数据库连接冲突

     引发的数据库断连


问题解决:

    QT连接采用QSqlDatabase::addDatabase 方法声明ODBC连接方式时,第二个参数 connectionName项设置为空时,器默认值

为defaultConnection,一下是MSDN上的解释:

If connectionName is not specified, the new connection becomes the default connection for the application, and subsequent calls to database() without the connection name argument will return the default connection. If a connectionName is provided here, use database(connectionName) to retrieve the connection.


由上可知,当connectionName为空时,当代调用该数据库时会返回一个默认的连接,这时当连接创建成功时,在 单线程程序中,由于内存/连接池中只存在一份该连接,因此

当程序调用进行查询等操作时,系统会返回该唯一的默认连接,这时的查询等操作是正常的,这也是尝试方法一可以的原因。 一但程序在多线程中进行数据库连接时,由于未

指定数据库连接名称,当连接建立成功后,需要使用该DB链接进行数据库操作时,系统不知道返回那个具体对应的连接,这样就会随机分配一个默认连接,当该链接不在该线

程时,就会出现数据库操作失败的现象。


小结:

     当线程程序中,使用单一的数据库连接不存在连接成功后,连接名无效无法使用的现象。  多线程程序中,当程序出现多个连接时,一定要在创建数据库连接时指定该

连接名,这样线程在调用时就能绑定相应的连接名,不会出现系统默认随机分配的连接名,导致操作失败。




你可能感兴趣的:(QT下链接SQLServer2012数据库异常处理记录)