共有フォルダーに SQLite3 データベースがあります。Java アプリケーションから db ファイルを上書きしたい。このファイルの読み取りおよび書き込みトラフィックは少ないですが、a) 上書きによって db ファイルが破損しないこと、および b) db ファイルにアクセスしようとしている可能性のある人は、上書きされるまでファイルがロックされていることを基本的に確認したいと考えています。完了です。私の現在の計画は次のようになります...
String query = "BEGIN EXCLUSIVE TRANSACTION";
/* Execute this query*/
File sourceFile = new File(LocalPath);
File destFile = new File(DbPath);
InputStream inStream = new FileInputStream(sourceFile);
OutputStream outStream = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int length;
while((length = inStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}
inStream.close();
outStream.close();
/* Now release lock */
query = "ROLLBACK TRANSACTION";
/* Execute query */
ここで SQLite のガイダンスを読むhttp://www.sqlite.org/howtocorrupt.html、このロックはジャーナルに存在し、ロールバックトランザクションを実行するとコピー後に更新されるようです。それまでの間、コピー中にクライアントがデータベースにアクセスしようとすると、ファイルが見つからないだけで、SQLite ドライバーはデータベースが存在しないと想定します。右?
私の質問は...データベースにロックをかけることは問題ですか?データベースが見つからないのではなくロックされているように見せるためのより良い戦略または方法はありますか? また、これを実行不可能にする DB 破損の大きなリスクを冒していますか? 私が持っていたもう1つの考えは、dbファイルをロックし、新しいファイルを別の名前に書き込み、書き込みが完了したら名前を変更し、ロックを解放することです...それについて何か考えはありますか?
DB ファイルを上書きすることが素晴らしいアイデアかどうかはわかりませんが、私が自由に使えるリソースに対して考えられる唯一の実現可能な方法です (ネットワークを介して共有フォルダー内のデータベースで巨大なトランザクションを実行するのは容認できないほど遅いです。私は承知しています)。共有フォルダーで SQLite データベースを使用すると、破損のリスクが高くなります)。私は更新をローカルに書き込んでおり、ユーザーが変更を「コミット」してdbファイルのコピーを開始することを選択できるようにしています。
私の質問への回答に加えて、このケースに関する一般的なアドバイスを歓迎します...