ste*_*eve 2 python sqlite django
我一直在努力"sqlite3.OperationalError数据库被锁定"一整天......
寻找答案似乎是一个众所周知的问题,我发现大多数情况下,sqlite在多线程中不能很好地解释,其中线程可能会超时等待超过5(默认情况下) timeout)写入db的秒数,因为另一个线程有db锁.
因此,有更多的线程与数据库一起使用,其中一个使用事务并经常写入我已经开始测量事务完成所需的时间.我发现没有任何事务需要超过300毫秒,因此上述说明并不合理.除非使用事务的线程进行~21(5000 ms/300 ms)连续事务,而任何其他希望写入的线程都会被忽略
那么其他假设可以解释这种行为呢?
我之前遇到过很多关于Sqlite的问题.基本上,没有多个线程可能会写入数据库.如果这是不可接受的,您应该切换到Postgres或其他更好的并发性.
Sqlite有一个非常简单的实现,依赖于文件系统进行锁定.大多数文件系统不是为这种低延迟操作而构建的.对于网络安装的文件系统和某些VPS解决方案使用的虚拟文件系统(最后一个让我BTW),尤其如此.
此外,您还拥有Django层,增加了复杂性.你不知道Django什么时候发布连接(虽然我很确定这里有人能详细给出答案:)).但同样,如果您有多个并发编写器,则需要一个数据库层而不是并发.期.
我通过切换到postgres解决了这个问题.Django为您提供了这个非常简单的功能,即使迁移数据也很简单,只需很少的停机时间.