多线程如何并发访问SQLite数据库

多线程如何并发访问SQLite数据库,第1张

SQLite作为一款小型的嵌入式数据库,本身没有提供复杂的锁定机制,无法内部管理多路并发下的数据 *** 作同步问题,更谈不上优化,所以涉及到多路并发的情况,需要外部进行读写锁控制,否则SQLite会返回SQLITE_BUSY错误,以驳回相关请求。

返回SQLITE_BUSY主要有以下几种情况:

1。当有写 *** 作时,其他读 *** 作会被驳回

2。当有写 *** 作时,其他写 *** 作会被驳回

3。当开启事务时,在提交事务之前,其他写 *** 作会被驳回

4。当开启事务时,在提交事务之前,其他事务请求会被驳回

5。当有读 *** 作时,其他写 *** 作会被驳回

6。读 *** 作之间能够并发执行

基于以上讨论,可以看出这是一个典型的读者写者问题,读 *** 作要能够共享,写 *** 作要互斥,读写之间也要互斥

可以设计如下的方案解决并发 *** 作数据库被锁定的问题,同时保证读 *** 作能够保持最大并发

1。采用互斥锁控制数据库写 *** 作

2。只有拥有互斥锁的线程才能够 *** 作数据库

3。写 *** 作必须独立拥有互斥锁

4。读 *** 作必须能够共享互斥锁,即在第一次读取的时候获取互斥锁,最后一次读取的时候释放互斥锁

实际上并不是那么简单的用管道流实现的,当然如果你能保证同步的话可以直接用管道

线程这个东西本来就是共享进程资源的,所以没有特殊的传送机制,直接使用就行了。在java中就是直接使用对象里的字段。

你这个就是一个生产者消费者模型,可以用一个队列实现,接受socket作为生产者往一个队列中存字符串,然后唤醒发送socket(也就是消费者了),消费者在一个无限循环中读取队列中的字符串,并且以其作为信号量实现同步

一.利用全局变量. 大家都可以访问,所以使用很方便.

二.利用PostThreadMesagge(ThreadId,Msg,0,0)来进行通讯.

其中要注意的问题是,因为利用CreateThread创建的线程是无消息获取通道,消息映射这些功能,只有有窗体的线程才具备这些功能,所以要自己获取消息队列,利用PeekMessage既可.

以上就是关于多线程如何并发访问SQLite数据库全部的内容,包括:多线程如何并发访问SQLite数据库、java实时数据字符串对象怎么在线程间传递、主线程和子线程可以用同一个数据库连接等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9694689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存