SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

分散DBMS「Mnesia」の並列処理

Erlangの並列処理に関する側面を解説

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルコード (1.1 KB)

Mnesiaテーブル

 データベーステーブルの定義も1回の操作だけで行います。この操作はスキーマのコピーがあるノードのいずれかで実行します。mnesia:create_table関数を使用して、テーブルの構造を設計したり、重要なテーブル属性を多数設定できます。次の例では、table1およびtable2を作成し、データを設定しています。

(first@charlie)3> test:start_tables().

=INFO REPORT==== 4-Jan-2010::16:22:27 ===
    application: mnesia
    exited: stopped
    type: temporary
stopped

 second@deltaでもtest.erlファイルをコンパイルしていれば、deltaでも上記の関数を実行できます。以下のコードを参照して、前述の関数mnesia:create_tableがどのように使用されるかを確認してください。

mnesia:create_table(table1,
[
    {type, set},
    {attributes, record_info(fields, table1)},
    {disc_copies, [first@charlie, second@delta]}  
])

 ご覧のように、この関数は、テーブルの特性を決定するタプル{key, value}のリストを引数として取ります。この場合は、table1という名前の「set」テーブルを作成します。このテーブルの列は、ファイルの最初の方にあるrecord命令で以下のように定義されています。

-record(table1, {table1_id, name, color, number}).

 disc_copiesキーに注目してください。このキーは、テーブルのハードディスクコピーを作成する場所を指定しています。これは、Mnesiaデータベースの冗長性をテーブルレベルで調整できるということを意味します。この場合は、table1のコピーをノードfirst@charlieとsecond@deltaのハードディスク上に作成します。次のセクションでは、この関数がどのように動作するかを説明します。

Mnesiaノードをテストする

 second@deltaノードで以下を実行します。

(second@delta)5> test:select().
[{table1,1,"record1","brown",1724},
 {table1,2,"record2","orange",2367},
 {table1,3,"record3","red",7834}]

 次に、シェルから抜けて、second@deltaノードをシャットダウンします。first@charlieノードで、table1に新規レコードを挿入します。

(first@charlie)6> test:insert().
ok
(first@charlie)7> test:select().
[{table1,1,"record1","brown",1724},
 {table1,2,"record2","orange",2367},
 {table1,3,"record3","red",7834},
 {table1,4,"record4","orange",8888}]

 今度は、second@deltaノードに再度電源を投入し、mnesia:start()でMnesiaエンジンを起動します。次に、table1のレコードを抽出します。

(second@delta)2> test:select().
[{table1,1,"record1","brown",1724},
 {table1,2,"record2","orange",2367},
 {table1,3,"record3","red",7834},
 {table1,4,"record4","orange",8888}]

 second@deltaがダウンしていたときにfirst@charlieノードに挿入されたレコードが、table1のコピーにも挿入されています。これは、second@deltaのスキーマ自体が、ブート中にfirst@charlieのスキーマと透過的に同期されたことを意味します。

 ram_copiesキーまたはdisc_only_copiesキーがテーブルに対して持つ意味は推測できるでしょう。テーブルのRAMコピーをノード上に保持することは、パフォーマンス面で優れたやり方です。しかし、この方法では当然、データを永続的に保持することはできません。ここで理解すべき重要なポイントは、Mnesiaの独創的なテーブルミラーリング機能です。

次のページ
Mnesiaノードを追加する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Roberto Giorgetti(Roberto Giorgetti)

イタリアに拠点を置くITマネージャ、テクニカルライター。主にビジネス分野と工業分野でオープンソースの開発に従事。核工学の学位を持つ。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5014 2010/04/05 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング