2012/02/29

Android:SQLiteのジャーナルファイル


SQLiteのロールバックジャーナルファイル

トランザクション更新処理を開始すると、トランザクションをロールバックするための
ジャーナルファイルが作成されます。
ジャーナルファイルは「データベース名-journal」という名前で作成されます。
# ジャーナルファイルは、データ更新中に外部からの参照アクセスへ応答するための
# 元データとしても使用されます。

アプリ実行中等にアプリデータ領域のdatabasesフォルダを見てみます。
root@android:/data/data/yuki.test/databases # ls -l
ls -l
-rw-rw---- app_145  app_145      5120 1980-01-06 05:34 test.db
-rw-r--r-- app_145  app_145         0 1980-01-06 05:34 test.db-journal

test.db-journalというファイルが作成されていますね。
トランザクションをコミットしたりロールバックすると、このファイルは削除あるいは無効
となります。

場合によっては、ジャーナルファイルの削除がパフォーマンスに悪影響を及ぼすケースが
あります。
そのため、ジャーナルファイルの削除には複数のモードが用意されています。
※Androidアプリがジャーナルモードを指定できるかは未調査

データベースのジャーナルモードを調べてみます。
調べたいデータベースをsqlite3シェルモードで開き、下記コマンドを発行します。
sqlite> PRAGMA journal_mode;
PRAGMA journal_mode;
truncate

自機ではtruncateが取得できました。取得できるモード一覧は下記です。
  • DELETE:トランザクション終了時にジャーナルファイルを削除する
  • TRUNCATE:トランザクション終了時にジャーナルファイルサイズを0にする
  • PERSIST:トランザクション終了時にヘッダを無効にして使用不可にする
  • MEMORY:ジャーナルファイルをメモリ上に保存する
  • OFF:ジャーナルファイル機能を使用しない(トランザクションのロールバック不可)

「journalファイルが削除されない」と言ったケースでは、ジャーナルモードを取得して
みましょう。
モードTRUNCATEであれば、正常にトランザクション終了している場合はファイルサイズが
0になっているはずです。

以上です。