【问题标题】:What is the maximum number of connections for a SQLite3 database?SQLite3 数据库的最大连接数是多少?
【发布时间】:2012-01-26 11:53:46
【问题描述】:

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

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

【问题讨论】:

  • sqlite 不允许并发写访问(即一次只能进行一个写事务),这就是为什么它不应该用于写工作量大的网站。

标签: database sqlite


【解决方案1】:

http://sqlite.org/whentouse.html 解释“另一个 RDBMS 可能工作得更好的情况”:

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

【讨论】:

  • 这个答案已经过时了!
【解决方案2】:

对于同一进程,sqlite 中的并发连接数实际上没有预先定义的限制。这取决于您的系统性能。 user647772给出的引用是关于使用同一sqlite DB的并发进程或应用程序的限制,对同一进程中的并发线程无效。

【讨论】:

    【解决方案3】:

    不同系统下,这个值可能不同,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 连接到多个数据库或单个数据库?
    • 这不是 sqlite3 的限制。您在这里遇到的问题是您可以在单个 linux 进程中一次打开的文件句柄数量的默认限制。默认限制为 1,024。您看到的是 1,021 个打开数据库的句柄和一个用于 stdin、stdout 和 stderr 的文件句柄。然而,这只是一个默认值,可以很容易地更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多