2017-12-04 2 views
0

これは、Python 2.7のコンテキストマネージャーでの再入力によるファイルロックの良い方法ですか?私は、rlock()が効果的になるようにしたいので、単一のデータベースファイルを使用するマルチスレッドアプリケーションを得ることができます。SQlite3コンテキストマネージャー(Python 2.7でファイルをロックする)

import sqlite3 
import threading 
import os 

class ConnectionHolder: 
    def __init__(self, connection): 
     self.path = connection 
     self.lock = threading.RLock() 

    def __enter__(self): 
     self.lock.acquire() 
     self.connection = sqlite3.connect(self.path) 
     self.cursor = self.connection .cursor() 
     return self.cursor 


    def __exit__(self, exc_class, exc, traceback): 
     self.connection .commit() 
     self.connection .close() 
     self.lock.release() 

conn_holder = ConnectionHolder(os.path.join(os.path.dirname(__file__), 'data/db/database.db')) 

if __name__ == '__main__': 
    with conn_holder as c: 
     c.execute("SELECT * FROM 'sample_table'") 
     result = c.fetchall() 
     print result 
+0

SQLiteはあなたのために[注意してください](https://sqlite.org/threadsafe.html)する必要があります。 – Goyo

+0

私はデータベースのロックエラーが発生したので、私は他の解決策を探しています。 – morpheus65535

+0

所有者専用のロックは役に立ちません。とにかく、ビジータイムアウトを増やすだけです。 –

答えて

0

最終的にコミットする前に長いループ(約2分)を実行していた場所を私のコードで気に入っています。私はこれを訂正し、@DBが示唆するように、ビジータイムアウトを30秒に増やします。問題は解決されたようです。みんなありがとう!

関連する問題