python sqlite多线程编程

来源:互联网 发布:大脚 mac 编辑:程序博客网 时间:2024/03/29 04:10

.前言

为什么要特别指出sqlite的多线程呢?因为创建一个sqlite连接只能给创建这个连接的线程使用,按照连接池的一般做法,先初始化几条连接conn放到池里,显然不行(别的线程用不了)。如果换一种策略,在第一次使用连接时,才由线程创建连接,然后映射到线程推到池里,在连接使用前先验证连接是否可用--这是一种不错的实现。

下面,是简单实现,不涉及池~~,有时间在实现。

  1. 首先,定义一个类,操作某数据库test表的增.删.查,命名为testDao,哦,no!这名命名太狗血了吧。
    import threadingimport os,sqlite3class Dao(object):    '''    数据持久化处理类    '''        def __init__(self,path,name='',*args,**kwargs):        '''        初始化工作...        '''        self.lock = threading.RLock() #锁        self.name = name        self.path = path #数据库连接参数        db_path = self.path[:self.path.rfind(os.sep)]        if os.path.exists(db_path):            os.makedirs(db_path)             def get_conn(self):        '''        建立连接,为什么不能设置为实例成员?自己想想,--        '''        conn = sqlite3.connect(self.path)        return conn        def conn_close(self,conn=None):        '''        操作完,关掉连接        '''        conn.close()            def save(self,obj,conn=None):        '''        保存数据        '''        cu = conn.cursor()        cu.execute(obj.to_insert_sql())        

  2. 定义数据库连接相关的拦截器.在func调用前连接数据库,func调用结束提高事务并关闭连接.
    def conn_trans(func):    '''    数据库连接相关的拦截器.在func调用前连接数据库,func调用结束提高事务并关闭连接.    '''    def connection(self,*args,**kwargs):        self.lock.acquire()        conn = self.get_conn()        kwargs['conn'] = conn        rs = func(self,*args,**kwargs)        self.conn_close(conn)        self.lock.release()        return rs    return connection

  3. 使用拦截器,拦截save方法
    @conn_trans()      def save(self,obj,conn=None):        '''        保存数据        '''        cu = conn.cursor()        cu.execute(obj.to_insert_sql())