免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13225 | 回复: 8

多线程写SQLite3数据库,遇到数据库锁住的问题,问大侠们如何解决? [复制链接]

论坛徽章:
0
发表于 2010-12-27 23:33 |显示全部楼层
如果线程数过大,数据库会出现锁住的现象
代码如下:
  1. #!/usr/bin/env python
  2. #-*-coding:utf-8-*-
  3. # 多线程写入数据库测试


  4. # 导入模块
  5. import threading,sqlite3,sys
  6. from time import ctime,sleep


  7. class MyThread(threading.Thread):
  8.     ''' 线程模块 '''
  9.     def __init__(self,func,args,name=''):
  10.         threading.Thread.__init__(self) # 显式调用父类初始化
  11.         self.name=name
  12.         self.func=func
  13.         self.args=args
  14.     def getResult(self):
  15.         return self.res # 返回函数结果
  16.     def run(self):
  17.         print 'starting',self.name,'at:',ctime()
  18.         self.res=apply(self.func,self.args) # 函数结果
  19.         print self.name,'finished at:',ctime()
  20.       
  21. flag=1
  22. def putsql(threadname):
  23.     global flag
  24.     ''' 写入数据库 '''
  25.     while flag:
  26.         con=sqlite3.connect("F:/workspace/test/threadsql.db")
  27.         cur=con.cursor()
  28.         try:
  29.             cur.execute("insert into threadtest (id,name) values (NULL,?)",(threadname,))
  30.         except Exception as E:
  31.             print E
  32.             sleep(5)
  33.         con.commit()
  34.         cur.close()
  35.         con.close()
  36.         print threadname,'Doing'
  37.         #sleep(1)

  38. def setflag(keys):
  39.     global flag
  40.     ''' 捕获键盘输入 用于控制数据库线程退出 '''
  41.     while 1:
  42.         ch = sys.stdin.read(1)
  43.         print ch
  44.         if ch==keys:
  45.             flag=0
  46.             break

  47. def main():
  48.     threads=25
  49.     threadarr=[]
  50.    
  51.     # 放入捕获线程
  52.     t=MyThread(setflag,('q',),setflag.__name__)
  53.     threadarr.append(t)
  54.    
  55.     # 放入工作线程
  56.     for i in range(threads):
  57.         t=MyThread(putsql,(putsql.__name__+str(i),),putsql.__name__)
  58.         threadarr.append(t)
  59.    
  60.     # 启动所有线程
  61.     for i in range(len(threadarr)):
  62.         threadarr[i].start()
  63.    
  64.     for i in range(len(threadarr)):
  65.         threadarr[i].join()

  66.     print  'all DONE'
  67.    
  68. if __name__=='__main__':
  69.     main()
复制代码

论坛徽章:
0
发表于 2010-12-29 10:59 |显示全部楼层
本帖最后由 zhyo 于 2010-12-29 11:00 编辑

回复 1# hlsd665
好像SQLite是单用户数据库,不能同时有多个线程进行操作。

论坛徽章:
0
发表于 2010-12-29 18:15 |显示全部楼层
谢谢楼上兄弟,这个俺查到了,而且俺也试了,结果是丢失数据。不行就换POSTGRESQL数据库了!

论坛徽章:
0
发表于 2010-12-30 13:42 |显示全部楼层
我记得是可以多线程操作的,但是要加上互斥锁,就是保证同一时间只有一个线程操作就行了

论坛徽章:
0
发表于 2010-12-30 14:21 |显示全部楼层
sqlite3有专门针对多线程环境下的工作模式 - shared cache model

论坛徽章:
0
发表于 2010-12-30 20:10 |显示全部楼层
sqlite3有专门针对多线程环境下的工作模式 - shared cache model
chenzengjie 发表于 2010-12-30 14:21



    求科普

论坛徽章:
1
天蝎座
日期:2014-02-28 16:08:53
发表于 2010-12-30 21:42 |显示全部楼层
学习

论坛徽章:
0
发表于 2010-12-31 19:37 |显示全部楼层
数据写到Queue中,用单独一个线程写数据库

论坛徽章:
0
发表于 2010-12-31 19:46 |显示全部楼层
数据写到Queue中,用单独一个线程写数据库
nmweizi 发表于 2010-12-31 19:37



    要是写到一个队列中,为啥还要用多线程写呢。呵呵,背离了多线程写数据库的意义。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP