Entry

プログラミングメモ - SQLite 3.x にある in-memory データベースと永続化

2010年08月12日

SQLite はデータベースという括りになっているので,普通は永続化層(二次記憶)で制御するミドルウェアという位置づけなんですけれど,スタンドアロンの GUI アプリに組み込む場合,それでは少し困ることがあります。それは,操作するたびに二次記憶をがちがちといじることになること。

Web アプリの場合は,単発のトランザクションについて二次記憶を制御することになるから,処理の単位が比較的シンプルだったりする。その一方で,普通のアプリケーションでは,例えば INSERT-文を発行したからといっても,それをすぐに永続化層に運んでもらいたくない(ディスクにセーブしてもらいたくない)ことがあります。例えば,Undo/Redo の扱い。いちいち二次記憶が動いてたら遅くて大変です。

また,Web アプリと違って,中規模の GUI アプリでは,ウィンドウやダイアログを複数開いて連携させることがあります。登録はこっちのウィンドウで行うけれど,コミットは別のウィンドウでしたい,けどさらに別のウィンドウでキャンセルが押されたらロールバック,最終的な永続化は保存ボタンを押したとき,保存しないで終了したときは編集結果を破棄する,みたいな制御をする場合,ディスク上でこれやるのは大変です(できなくはないんだけれども)。

で,SQLite の場合,こうしたローカルアプリのために,メモリ上にデータベースを持つ仕組み(in-memory database)が用意されています。これを使えば,起動中はメモリ上にデータベースを展開しておいて,保存するときにメモリ上のデータベースをファイルに書き出す,なんてことができたりします。

あたしゃしばらく,メモリ上にデータベースを展開するのはいいとしても,どうやって永続化するのかわかってなかったのでした。で,どうすんだ?と思っていたところ,それ用のドキュメントが用意されていました(参照:SQLite Backup API)。バックアップとかいうから,データベースマネジメントのことかと思ってた。

MFC でドキュメント/ビューアーキテクチャを使っていると,CDocument クラスを継承した自前のドキュメントクラスで,永続化の処理を行うことになります。何か操作するたびに,ドキュメントクラスで二次記憶向けのトランザクションが発生するのは嫌だな……と思っていたんですけれど,こゆ方法があったんですね。この仕組みを使えば,メモリ上の操作とディスク上の操作をうまく棲み分けさせることができそうです。

ま,ただ知らなかったからメモっただけ。便利だなー……SQLite。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN