zoukankan      html  css  js  c++  java
  • [转载]Python SQLite3的问题sqlite3.ProgrammingError: SQLite objects created in a thread

    转自:https://blog.csdn.net/blueheart20/article/details/70218102

    Python SQLite3的问题sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in th

    引言: SQLite是基于文件系统的mini数据库,我们用以存放简便的数据,本文将描述在代码中碰到的并发问题。

    1. 问题的提出

     最近在跑python代码过程中,使用sqlite的时候,碰到了如下错误信息: 

    1.  
      Mon, 17 Apr 2017 16:00:00 base.py[line:131] ERROR Job "save_data (trigger: cron[day_of_week='mon-fri', hour='16'], next run at: 2017-04-18 16:00:00 CST)" raised an exception
    2.  
      Traceback (most recent call last):
    3.  
      File "C:Program FilesPythonlibsite-packagesapschedulerexecutorsase.py", line 125, in run_job
    4.  
      retval = job.func(*job.args, **job.kwargs)
    5.  
      File "indexdata.py", line 238, in save_data
    6.  
      sqlite_obj.insert_data("index50", datetime.datetime.now().strftime("%Y-%m-%d"), final_data['value'])
    7.  
      File "C:workspacestock-crawlerstockindexutilSQLiteUtil.py", line 27, in insert_data
    8.  
      self.cx.execute(self.insert_sql_str, [name, date, valdata, datetime.datetime.now()])
    9.  
      sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in thread xxxx

    代码为多个线程进行数据库的读写操作。这里简要列出关键的数据库操作,主要集中在insert/update操作。

    2. 问题分析

     从错误信息来分析,问题是sqlite本身应对多个线程并发访问过程中的冲突问题,由一个线程创建并访问的sqlite的数据库,无法允许另外一个线程进行访问。这里的解决办法可能有2个:

    •  通过队列规避多线程的访问
    •  通过设置或者多个访问管道,规避线程之间的冲突问题

      从技术上评估,2个方法都可以解决问题,哪种更具优势?

    3. 问题解决

      通过网上搜索发现,其实可以通过设置sqlite文件的读取方式,可以简单规避掉线程之间的冲突问题:

    1.  
      def initDB(self, file_path):
    2.  
      self.file_path = file_path
    3.  
      self.cx = sqlite3.connect(file_path, check_same_thread=False)
    4.  
      self.cx.execute(self.create_table_str)
    5.  
      self.cx.execute(self.create_detail_table_str)
    6.  
      print("init the table strucutre successfully")
      check_same_thread这个设置为False,即可允许sqlite被多个线程同时访问

    4. 总结

     对于sqlite而言,所有的读取或者打开操作,都是有check_same_thread的设置,与语言无关。

  • 相关阅读:
    解决hung_task_timeout_secs问题【方法待校验】
    C++面向对象程序设计 学习心得
    试水训练1
    并查集
    ACM儿童节热身训练
    图论部分学习小结
    ACM儿童节热身训练
    堆及其应用学习小结
    ACM本周小结
    POJ-3273-Monthly Expense
  • 原文地址:https://www.cnblogs.com/workingdiary/p/13897414.html
Copyright © 2011-2022 走看看