multithreading - SQLITE3 CLSQL多线程插入导致错误

标签 multithreading common-lisp clsql

我想使用带有多个并行线程的 sqlite3 数据库。我读到使用连接池可以使访问线程安全,但在插入数据时仍然出现错误。

(make-thread
   #'(lambda()
       (dotimes (i 100)
          (with-database (db ("/path/to/db") 
                         :database-type :sqlite3 :pool T)
            (do-stuff-with db)))))

在此错误中以这种方式使用多个线程时

While accessing database # with expression "INSERT INTO ...": Error 5 / database is locked

是否可以使用 sqlite3 数据库进行多线程插入?如果是的话怎么办?

最佳答案

SQLite 不支持多个写入事务的并发。来自 SQlite site :

SQLite supports an unlimited number of simultaneous readers, but it will only allow one writer at any instant in time. For many situations, this is not a problem. Writer queue up. Each application does its database work quickly and moves on, and no lock lasts for more than a few dozen milliseconds. But there are some applications that require more concurrency, and those applications may need to seek a different solution.

Cl-sql 的编写目的是为典型的客户端-服务器关系 DBMS 提供“统一”接口(interface),就像其他“标准化”库(例如 JDBC 或 ODBC)一样,但 SQLite 是一个“非典型”数据库管理系统: Practice it 是一个库,提供 SQL 作为语言来访问简单的“文件中的数据库”以及 DBMS 的一些其他功能。例如,它没有真正的并发控制(它使用操作系统功能来锁定数据库文件),因此它不能被视为“真正的”DBMS,并且 cl-sql 只能提供底层系统的功能。

因此,如果您需要并发插入数据库,您应该使用其他内容,例如 PostgreSQL .

关于multithreading - SQLITE3 CLSQL多线程插入导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31325248/

相关文章:

ios - 在 For 循环之后添加具有依赖项的 NSOperation

clojure - 多重方法如何解决 namespace 问题?

lisp - 用最后一个元素替换子列表

mysql - 在 Windows 上使用 MySQL 作为后端的 CLSQL 问题

sqlite - 如何创建sqlite3数据库

c# - 使用/不使用 delegate() 启动线程

java - 不同线程同时调用方法

java - Java 中使用信号量的多线程

macros - 为什么我们修改它时需要重新编译使用Common Lisp宏的定义?

common-lisp - 在 Common Lisp 中以宏列表作为参数的宏