OmniBaseの使い方
OmniBaseは、Smalltalkの辞書(Dictionary)を使うのとほぼ同じ形で任意の構造のデータを保存し、取り出すことができます。データベースには、一つのルートとなる辞書があるので、これを起点として、データにキーをつけて登録します。
データベースの生成
db := OmniBase createOn: ‘ディレクトリのパス’.
既存のデータベースがある場合は単にオープンします。
db := OmniBase openOn: ‘ディレクトリのパス’.
データの登録
登録のためのトランザクションを開始してから、ルート辞書を取り出し、格納します。
tra := db newTransaction.
tra root at: yourKey put: yourObj.
.. (格納)
.. (格納)
yourKey, yourObjは任意のオブジェクトです。ただしBlockContextのような実行時コンテキスト情報を含むものは、対象外です。(単に文字列として格納されます)。
格納後、トランザクションをコミットするとデータベースに変更が反映されます。
tra commit.
競合の発生と対処
コミット時に、すでにデータが別のクライアントによって操作されていた場合、競合の発生ということで、commit操作が失敗します。この場合トランザクションをabortすることになります。
[tra commit]
on: ODBLockingConflict
do: [:ex | tra abort].
データの取り出し
読み込みのためのトランザクションを開始し、ルート辞書を取り出し、キーを指定してデータを取得します。
tra := db newTransaction.
tra root at: yourKey.
読み込んだ後で、トランザクションを閉じる必要はありません。同じトランザクションをデータ登録用にも使うことができます。
明示的にトランザクション内でのデータ書き込みを禁止したい場合、
tra := db newReadOnlyTransaction.
とすることもできます。
データベースの終了
データベースを終了させるには、単に
db close
とします。
ガイドライン
データベースの開始・終了処理には時間がかかるので、あまり頻繁には行わないようにしましょう。
一方、データの競合を防ぐため、トランザクションはなるべくこまめに開始、コミットを繰り返すのが良いでしょう。
OmniBase内に格納されたオブジェクトは、トランザクションの外からは単に抜け殻(プロキシ)としてしか見えなくなってしまいます。この辺りがお手軽DBの限界でもあります。トランザクションの外でオブジェクトを保持したい場合、オブジェクトを明示的にコピーする必要があります。
便利クラス
データベースアクセスのためのコードというのは大抵の場合、同じような書き方になるものです。そのため、アクセス用のコードを閉じこめたクラスを作っておくのも手でしょう。
非常に簡単なものですが、作ってみました。 展開してファイルインしてください。
MuOmniBaseAccessor.zip
これを使うと、
格納:(do it)
MuOmniBaseAccessor commitDo: [:tra | tra root at: 'テスト' put: #('これはテストです' 'テストですとも')].
取り出し:(print it)
MuOmniBaseAccessor readDo: [:tra | (tra root at: 'テスト') yourself].
とわずか一行でできます。通常のDictionaryを使うのと、ほとんど手間がかわりません。楽ですよー。OmniBase。
※追記
もうちょっとリッチなやつをSqueakSourceJに置いています。よろしければどうぞ。
http://swikis.ddo.jp:9091/DBAccessor/
最適化
簡単に使おうとすれば、やたら簡単に、最適化しようと思えば、とことん最適化できるというのが、良いDBの指針であります。
OmniBaseも様々な最適化方法がありますが、重要なのはコンテナの利用です。
ここでは、詳しくは書きませんが、興味のある方は、
OmniBase Tutorial
を読んでみると良いでしょう。
Link to this Page
- OmniBaseJ last edited on 15 November 2008 at 1:49:01 pm by PPPbm6512.tokyo-ip.dti.ne.jp