SQLite3数据库的最大连接数是多少?

36

SQLite3数据库的最大连接数是多少?

为什么我不能将其用于非常大的网站,例如拥有300万用户的网站?


11
SQLite不允许并发写入访问(即一次只能进行一个写事务),这就是为什么它不应该用于具有大量写入工作负载的网站的原因。 - Dan D.
3个回答

42

http://sqlite.org/whentouse.html解释了“另一个RDBMS可能更适合的情况”:

SQLite在整个数据库文件上使用读者/写者锁。这意味着如果任何进程正在从数据库的任何部分读取,所有其他进程都将被阻止写入数据库的任何其他部分。同样,如果任何一个进程正在向数据库写入,所有其他进程都将被阻止读取数据库的任何其他部分。对于许多情况,这不是问题。每个应用程序都可以快速完成其数据库工作并继续进行,而且没有锁定持续时间超过几十毫秒。但是有些应用程序需要更多的并发性,这些应用程序可能需要寻找不同的解决方案。


3
这个答案已经过时了! - Cosinus
3
@Cosinus:你能详细说明一下吗? - Joe Schmoe
@JoeSchmoe SQLite支持无限并发读取。回复中的引用来自2012年。在2013年发生了变化。 - srn

6

实际上,在同一进程中,sqlite的并发连接数量没有预先定义的限制。这取决于您系统的性能。用户647772给出的引用是关于使用相同的sqlite数据库的并发进程或应用程序的限制,而不是适用于同一进程中的并发线程。


5

在不同的系统下,这个值可能是不同的。以下是Python测试代码:

import sqlite3
import sys

# connect to multiple databases
def multi_connect(conn_num):
    dbs = []
    for i in range(0, conn_num):
        try:
            con = sqlite3.connect(str(i) + '.db')
        except Exception as e:
            print('connect to %d.db failed' % i)
            sys.exit(-1)


# multiple connections to single database
def multi_connect2(conn_num):
    db_name = 'x.db'
    conns = []
    for i in range(0, conn_num):
        try:
            conn = sqlite3.connect(db_name)
        except Exception as e:
            print('connect failed at %d' % i)
            sys.exit(-1)

在Ubuntu下,失败次数为1021,您可以在不同的操作系统下进行测试。

你的测试结果如何?1021个连接是指连接到多个数据库还是单个数据库? - Bruno Bieri
21
这不是sqlite3的限制。你所遇到的问题是单个linux进程中可以同时打开的文件句柄数量的默认限制。默认限制是1024。你看到的是有1021个句柄持续打开着数据库,另外还有三个文件句柄分别用于标准输入、标准输出和标准错误输出。但这只是默认值,可以很容易地修改。 - Michael Speer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接