Missing Alternate TagMissing Alternate TagMissing Alternate TagMissing Alternate TagMissing Alternate TagMissing Alternate TagMissing Alternate TagMissing Alternate Tag

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