首页 > 编程知识 正文

多线程同时写数据库(连接不上mysql数据库)

时间:2023-05-04 10:10:42 阅读:75677 作者:3473

源地址: http://blog.csdn.net/golden hawking/article/details/10811409

完全舍弃MFC,全面应用Qt已经相当长的时间了。 除了自己看书每一步做十几个验证性的APP应用外,还正式做了三个比较大的行业APP应用,总体感觉不错。 在Native C中,Qt基本上是我用过的最简单的接口库。 虽然遇到了一些问题,但大部分问题都顺利解决了。 回顾一下,有几个问题。 特别是数据库APP。 在这里分享我的经验。

1、线程中的数据库注册和连接冲突问题

文档简要说明了多线程数据库APP应用的注意事项。 在一个线程中创建的qsql数据库对象和查询的QSqlQuery对象只能在本线程中使用(注意,它们是对象,而不是数据库连接本身)。 连接本身可以按名称在多线程中使用)。 对于需要多个线程同时访问不同数据库的APP应用程序,首先尝试在每个线程的开头分别使用不同的名称调用addDatabase/database和open,但程序偶然崩溃。 跟踪后发现,Qt声称很多方法都是“线程安全的”,但如果几种方法联系起来就会出现问题。 Qt动态加载数据库的插件。 加载plugin的部分与管理本地库文件有关,这一部分存在冲突。 因此,自然地考虑在初始连接部分设置Mutex保护,从addDatabase/database到open的部分,为了保证其原子性不再发生问题。

2、数据库连接意外断开后恢复连接的问题

在MFC中,一旦中途TCP连接断开,就直接重新打开即可。 在Qt上,这一招行不通。 即使调用close,也不能再次打开。 处理方法:

如果检测到问题,请关闭连接并删除数据库; 然后,不要立即添加数据库,相反,要返回到与其连接的事件循环。 由于没有详细信息和源代码,很可能在删除数据库后的事件循环中在Qt内部执行了一些释放操作。 我该怎么办? 例如,重新添加数据库一分钟就可以了。 如果很着急,请直接显式调用processEvent ) )方法以强制循环。

多线程需要注意1个问题,并需要Mutex保护。

3、数据库插件相关性问题

在Windows上,我们的机器可能会被按下几个Qt版本,但在PATH上干脆不设置神马,而是根据开发环境的继承环境适应不同的版本。 这有两个问题。 一种方式是,在发布程序时,数据库驱动程序依赖的dll也使用与可执行文件相同的路径发布。 例如mysql的dll、PostgreSQL的依赖等。 第二,在集成开发环境中,这些依赖关系也位于可执行文件的文件夹下。 否则,甚至可以列举可用的驱动程序,但死活无法连接。 调试后,在路径中找不到依存关系,dll的加载失败了哦。

Qt的数据库操作是独一无二的,相对于复杂的ADO ODBCDAOOLEDB等传统的c访问数据库的方法,还很先进,充分体现了OO的理念。 对于数据库封装,想法很有趣。 设计者将进程中的数据库连接作为资源,每个连接都有唯一的名称,可以在全局add数据库、removeDatabase、cloneDatabase中添加或删除,需要时可以直接在全局数据库中检索这样的好处是大大节省了开发人员的负担。 以前,为了传递数据库连接的变量,必须在许多方法的签入位置添加对该变量的指针或引用,有时还必须在对象的属性中添加静态变量以记录该连接。 你现在想什么时候用? 给你个名字就行了。 不需要给。 当然,文档是比较简化的。 请注意至少两点

1 )虽然这些添加/删除方法被称为线程安全,但请注意,在实际的APP应用程序中,Mutex会保护全局创建过程,或者通过重载这些函数来创建自己的安全版本。

2 )在一个线程中创建的数据库对象(例如,add数据库的返回值)只能用于同一线程。 但是,add数据库注册的连接)的名称由开发人员决定)可以在线程之间使用。 唯一需要注意的是,调用全局方法时需要原子保护。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。