2

これは、python 2.6.6、sqlite3 で発生します。sqlite を使用する db クラスがあります。以下はその初期化の一部です。

def _init_db(self):
"init the database tables and indices"
    print '\n'.join(DROP_TABLES[0:1])
    print '\n'.join(CREATE_TABLES[0:1])
    print '\n'.join(CREATE_INDEXES[0:1])
    print '\n'.join(CREATE_TRIGGERS[0:1])
    for query in DROP_TABLES:
       self.connection.execute(query)
#   self.connection.commit()
    for query in CREATE_TABLES:
       self.connection.execute(query)
#   self.connection.commit()        
    for query in CREATE_INDEXES:
       self.connection.execute(query)
#   self.connection.commit()
    for query in CREATE_TRIGGERS:
       self.connection.execute(query)            
    self.connection.commit()

ここにクエリの印刷物があります。(私の意見では、完全を期すためにここではそれほど重要ではありません)

DROP TABLE IF EXISTS graph_T 

CREATE TABLE IF NOT EXISTS graph_T
(v1 int,
v2 int,
step_start int,
step_end int DEFAULT 2147483647,
value int DEFAULT 1,
path_kind int DEFAULT 0,
path_id long,
partial_path_id long) 

CREATE INDEX IF NOT EXISTS idxgraph_T
          ON graph_T(v1,v2)

CREATE TRIGGER IF NOT EXISTS trig_graph_T_path_id
AFTER INSERT ON graph_T
BEGIN
UPDATE graph_T SET 
path_id = (10000 * 10000 * max(new.v1, new.v2) + 
    10000 * min(new.v1, new.v2) + 0 ) ,
partial_path_id = 10000 * 10000 * max(new.v1, new.v2) + 
    10000 * min(new.v1, new.v2)
WHERE rowid = new.rowid;
END;

self.connection.execute 行の 1 つで sqlite3.OperationalError: データベース ファイルを開くことができません。3 番目または 4 番目の場合もあります (プログラムの他の場所でも発生します)。

私は窓に取り組んでいます。なぜこれが起こっているのか、何が間違っているのかわかりません。提案をいただければ幸いです。

詳細情報 (質問があったため): - 同時アクセスを使用していません。スレッドなどはありません。

編集-詳細情報:すべてのconnection.execute行に時間指定の再試行を追加しましたが、通常は1回か2回失敗してから動作します。実行コマンドが返されたときに、データが実際にディスクに書き込まれなかった可能性があると推測しています。

4

3 に答える 3

3

私の直感では、ソフトウェアではなく、ファイルシステムで何か疑わしいことが起こっているに違いないと思います。おそらくこれらの1つ:

  • バックアップ スクリプトがファイルまたは親フォルダーを一時的に移動/名前変更しています
  • ファイルシステムは「ローカル」に見えますが、実際には SAN であり、断続的な問題があります
  • 透過的な暗号化など、他のファイルシステム指向のカーネル モジュールが SQLite システム コールに干渉している
  • 侵入検知ソフトウェアが SQLite システム コールに干渉している
  • 別のユーザーが知らないうちにファイルを読み取り用に開いています
  • それはウイルスです:-)
于 2012-05-14T15:11:17.370 に答える
2

SQLite は同時アクセスが苦手です。複数のスレッドまたはプロセスが同じデータベース ファイルにアクセスしている場合、この問題が発生します。

于 2012-05-13T17:24:09.353 に答える