私の製品では、SQLite を使用して Windows サービスとユーザー レベルのアプリケーション間でデータを共有したいと考えています。しかし、私はいくつかの問題に直面しています。
ユーザーレベルのアプリケーションが SQLite データベースを作成すると、両方のプログラムで問題なく使用できます。しかし、サービスが SQLite データベースを作成する場合、SQLite は並行性を非常にうまく処理していないようです。データベース接続がアクティブである限り、サービス プロセスは書き込みロックを保持しているようです。ユーザーレベルのプロセスによる試行は、通常のエラーではなく、共有メモリ関連のエラー (私が見たSQLITE_IOERR_SHMOPEN
および) を引き起こします。もちろん、サービスがデータベースへの接続を閉じると、ユーザーレベルのプロセスが再びアクセスできるようになります。SQLITE_IOERR_SHMMAP
SQLITE_LOCKED
サービスはLOCAL_SERVICE
ユーザーとして実行されており、SQLite データベースは共有システム ディレクトリ ( C:\ProgramData\...
)にあり、先行書き込みログ (編集) を使用しています。
私の理論では、SQLite はユーザー レベルのプロセスとサービスの間でメモリを共有できないため、これらのプロセスが 2 つの同時接続を保持することは不可能です。
誰かがこれに対処しましたか?両方のプロセスがデータベースを同時に必要としないようにするために一生懸命努力する以外に解決策はありますか?