Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一个全局python应用程序中使用来自多个模块的SQLite3的最佳方法是什么?_Python_Python 2.7_Sqlite - Fatal编程技术网

在同一个全局python应用程序中使用来自多个模块的SQLite3的最佳方法是什么?

在同一个全局python应用程序中使用来自多个模块的SQLite3的最佳方法是什么?,python,python-2.7,sqlite,Python,Python 2.7,Sqlite,目前,我在Python2.7中开发了一个web应用程序,它构建在我在主python应用程序中导入的两个模块上,并从中调用函数。几乎所有这些模块都在打开到同一个SQLite3数据库的连接,其中一些模块不时地更新或插入到表中 有时,当两个或多个模块试图同时更新数据库时,会出现数据库锁定错误。这让我开始质疑自己 我一直打开和关闭与数据库的连接是做错了还是最好在程序开始时打开,然后在程序结束时关闭 在这种情况下,在我的所有模块之间共享此连接的更好方式是什么 谢谢你的帮助 Sqlite不是为处理并发访问(

目前,我在Python2.7中开发了一个web应用程序,它构建在我在主python应用程序中导入的两个模块上,并从中调用函数。几乎所有这些模块都在打开到同一个SQLite3数据库的连接,其中一些模块不时地更新或插入到表中

有时,当两个或多个模块试图同时更新数据库时,会出现数据库锁定错误。这让我开始质疑自己

我一直打开和关闭与数据库的连接是做错了还是最好在程序开始时打开,然后在程序结束时关闭

在这种情况下,在我的所有模块之间共享此连接的更好方式是什么


谢谢你的帮助

Sqlite不是为处理并发访问(特别是写访问)而设计的

保持连接打开通常是一个好主意,但这可能取决于使用频率

如果可以从多个线程访问数据库,那么使用相同的
Lock
RLock
封装所有线程是很有用的

例如,您可以为其编写上下文管理器,大致如下:

class ConnectionHolder:
    def __init__(self, connection):
        self.connection = connection
        self.lock = RLock()

    def __enter__(self):
        self.lock.acquire()
        return self.connection

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.lock.release()
用法:

conn_holder = ConnectionHolder(connection) #Global or in an app-wide accessible object

...
with conn_holder as conn:
    conn.<do something>
    ...


<Don't do anything more with conn>
您可以通过
changeSomeData()
直接或间接调用
getSomeData()


(好吧,根据数据库模式(WAL模式),您不需要为
getSomeData()
设置锁,但可能需要更复杂的情况。)

Sqlite不是为处理并发访问(特别是写访问)而设计的

保持连接打开通常是一个好主意,但这可能取决于使用频率

如果可以从多个线程访问数据库,那么使用相同的
Lock
RLock
封装所有线程是很有用的

例如,您可以为其编写上下文管理器,大致如下:

class ConnectionHolder:
    def __init__(self, connection):
        self.connection = connection
        self.lock = RLock()

    def __enter__(self):
        self.lock.acquire()
        return self.connection

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.lock.release()
用法:

conn_holder = ConnectionHolder(connection) #Global or in an app-wide accessible object

...
with conn_holder as conn:
    conn.<do something>
    ...


<Don't do anything more with conn>
您可以通过
changeSomeData()
直接或间接调用
getSomeData()


(好吧,根据数据库模式(WAL模式),您不需要为
getSomeData()
设置锁,但可能需要更复杂的情况。)

请查看我的答案并给出您的意见。谢谢@睡眠65535什么答案?抱歉,它被删除了。我不得不在另一个帖子里问:谢谢@睡眠65535我在这里添加了一些关于锁与锁的解释谢谢,我将为我的选择制作另一个课程。请看我的答案并给我你的评论。谢谢@睡眠65535什么答案?抱歉,它被删除了。我不得不在另一个帖子里问:谢谢@睡眠65535我在这里添加了一些关于锁与锁的解释谢谢,我将为我的选择制作另一个类。