2

複数のスレッドを並行して使用する sqlite3 データベースを使用したいと考えています。接続プールを使用するとアクセスがスレッドセーフになると読みましたが、データの挿入中にエラーが発生します。

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

このエラーでこの方法で複数のスレッドを使用すると

# 式「INSERT INTO ...」を使用してデータベースにアクセス中: エラー 5 / データベースがロックされている

sqlite3 データベースでマルチスレッド挿入を行うことさえ可能ですか? はいの場合、どのように?

4

1 に答える 1

4

SQLite は、複数の書き込みトランザクションの同時実行をサポートしていません。SQliteサイトから:

SQLite は無制限の数の同時リーダーをサポートしますが、任意の時点で許可されるライターは 1 つだけです。多くの場合、これは問題ではありません。ライターが待ち行列に入る。各アプリケーションはデータベースの作業を迅速に実行して先に進み、ロックが数十ミリ秒以上持続することはありません。ただし、より多くの同時実行性を必要とするアプリケーションもあり、それらのアプリケーションは別のソリューションを探す必要がある場合があります。

Cl-sql は、他の「標準化された」ライブラリ (JDBC や ODBC など) と同様に、典型的なクライアント サーバー リレーショナル DBMS に「統一された」インターフェイスを提供するように作成されていますが、SQLite は「非典型的な」データベース管理システムです。単純な「ファイル内データベース」にアクセスするための言語として SQL を提供するライブラリ、および DBMS の他のいくつかの機能。たとえば、実際の同時実行制御がない (オペレーティング システムの関数を使用して db ファイルをロックする) ため、"実際の" DBMS とは見なされず、cl-sql は基盤となるシステムの機能以上のものを提供できません。

したがって、データベースへの同時挿入が必要な場合は、別のもの、たとえばPostgreSQLを使用する必要があります。

于 2015-07-09T20:52:11.497 に答える