找回密码
 立即注册
收起左侧

QSQLITE: 主界面更新数据库,新线程不断采集写入数据库

5
回复
8181
查看
[复制链接]
累计签到:5 天
连续签到:1 天
来源: 2015-5-3 22:54:44 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 5free 于 2015-5-3 23:14 编辑

目前我遇到一个问题,主界面用 QSqlTableModel::select() 刷新数据库显示,另外一个线程不断采集数据写入数据库。但是会冲突,一旦主界面执行select()后,新线程的QsqlQuery::exec()就false了。返回的错误是  query.lastError() 内容为 QSqlError("5", "Unable to fetch row", "database is locked")

具体请看:http://www.qtcn.org/bbs/read-htm-tid-58840.html   同样的内容就不复制粘贴了。

我在这里想请教的是:不知道大家有没有写过这样的成功应用? 大家有没有碰到我这样的问题?如果碰到最后怎么解决的?

谢谢!

回复

使用道具 举报

尚未签到

2015-5-4 09:42:17 显示全部楼层
是不是sqlite只支持最大一个数据库连接?

mysql这些可以连20个都没问题
回复 支持 反对

使用道具 举报

累计签到:5 天
连续签到:1 天
2015-5-4 10:58:04 显示全部楼层
当表内容很少时,两个线程可以同时操作,没有错误。
但是当数据量大到一定程度时,比如数据库大小到14M以后,一旦qsqltableview执行 select , 另外一个线程的 qslquery就不能执行了。
如果将qsqltablemodel::setfilter设定一下条件,缩小范围,还是可以正常工作的。

猜测是 select() 将数据库锁定了,但是select只是读取啊,锁定做什么?
回复 支持 反对

使用道具 举报

累计签到:23 天
连续签到:1 天
2015-11-23 21:34:57 显示全部楼层
SQLLITE是共享锁机制~
未加锁状态的下一个状态是共享状态。为了能够从数据库中读(不写)数据,连接必须首先进入共享状态,也就是说首先要获得一个共享锁。多个连接可以同时获得并保持共享锁,也就是说多个连接可以同时从同一个数据库中读数据。但哪怕只有一个共享锁还没有释放,也不允许任何连接写数据库。

也就是说同时读没问题~但是写就有问题~

SQLLITE是小级别数据库~太大的应用不合适~
回复 支持 反对

使用道具 举报

累计签到:7 天
连续签到:1 天
2015-11-24 08:47:19 显示全部楼层
子线程使用主线程创建的database需要加锁,试试QMutex!保证你不会出问题!
回复 支持 反对

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-11-27 18:07:52 显示全部楼层
5楼做法不错 用锁机制在线程中保护资源是很不错的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了