SHOEISHA iD

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

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

SQL Anywhereの魅力を探る

モバイル環境に分散したデータを同期する「Mobile Link」

SQL Anywhereの魅力を探る 7


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

7.2 Getting Started

7.2.1 データベースの作成

 実際に同期スクリプトを書いてMobile Linkを体験してみよう。例題として、商品テーブルの同期を取り上げる(図7.8)。商品テーブルは、商品IDと在庫数からなる単純なものだ。サーバは、統合データベース、リモートデータベースサーバ、Mobile Linkサーバの3つがある。運用環境では別々のマシンで稼働させるのが普通だが、本稿では同じマシン上で稼働しているとする。

 統合データベースとリモートデータベースの作成から始める。

図7.8 : 例題のアーキテクチャ
図7.8 : 例題のアーキテクチャ
$ cd d:\asa9book\mobilelink
$ dbinit consol.db
$ dbinit remote.db

 両データベースに対して、接続に必要なODBCデータソース名を設定する。データソースに対する接続要求があれば自動的にデータベースが起動し、接続がなくなれば自動的にデータベースが終了する。

$ dbdsn -w consol -y -c
 "uid=dba;pwd=sql;eng=consol;dbf= d:\asa9book\mobilelink\consol.db"
$ dbdsn -w remote -y -c
 "uid=dba;pwd=sql;eng=remote;dbf= d:\asa9book\mobilelink\remote.db"

 両データベースに対してスキーマを作成する(注11)。

$ type schema.sql
CREATE TABLE product (
    product_id    VARCHAR(16),
    quantity      INTEGER,
    PRIMARY KEY   (product_id)
);
$ dbisql -c "dsn=consol" schema.sql
$ dbisql -c "dsn=remote" schema.sql
SQL Anywhere 10の場合
 SQL Anywhere 10の場合、Mobile Link用のシステムテーブルを作成する。
$ dbisql -c "dsn=consol" %SQLANY10%\MobiLink\setup\syncsa.sql
注11
 ここでは、統合データベースとリモートデータベースとで同じスキーマを用いたが、Mobile Linkはスキーマが異なっても同期可能である。

 統合データベースに対して初期データを3つ挿入する。リモートデータベースは空のままにしておく。

$ type data.sql
insert into product (product_id, quantity) values ('apple',  10);
insert into product (product_id, quantity) values ('banana', 20);
insert into product (product_id, quantity) values ('carrot', 30);
$ dbisql -c "dsn=consol" data.sql

 ここまではMobile Linkとは関係のないデータベースの設定である。次のセクションから、リモートデータベース、統合データベースの順で、Mobile Link同期の設定について見ていく。

7.2.2 リモートデータベースの同期設定

 リモートデータベースに対して、Mobile Link同期の設定を行う。(1) 同期ユーザ、(2) パブリケーション、(3) サブスクリプションを作成する。Mobile Link用語が一度に出てしまったが、リモートデータベースには3つの項目を設定することに注意する。

  1. 同期ユーザ
  2.  
    Mobile Link同期の認証としてのユーザ名(注12)。Mobile Link同期に使われるもので、データベース接続に用いるユーザとは別のものである。
     
  3. パブリケーション
  4.  
    同期対象となるテーブルを指定するもの。リモートデータベース上のテーブルのうち同期対象にしたいものをパブリケーションとして定義する(注13)。
     
  5. サブスクリプション
  6.  
    同期ユーザとパブリケーションとを結び付けるもので、Mobile LinkサーバのIPアドレスなどもここで指定する。
$ type ml_remote.sql
CREATE SYNCHRONIZATION USER moriwaki; ←同期ユーザの作成
CREATE PUBLICATION     pub  (TABLE product ); ←パプリケーションの作成
CREATE SYNCHRONIZATION SUBSCRIPTION
     TO pub ←サブスクリプションユーザの作成
    FOR moriwaki
   TYPE tcpip
ADDRESS 'host=127.0.0.1';
$ dbisql -c "dsn=remote" ml_remote.sql
注12
 ここでは設定しないが、パスワードも設定可能。
注13
 リモートデータベースと統合データベースとでテーブル名が異なってもMobile Linkは同期可能である。パブリケーションでは、リモートデータベースのテーブル名を指定する。また、テーブル内の一部のカラムを同期対象としたり、WHERE句で同期対象となる行を絞り込むこともできる。

 一見、3種類も設定があることは冗長なようだが、これらが柔軟な同期設定を可能にする。複数のパブリケーションと複数のサブスクリプションを作っておけば、同期対象を目的別に使い分けることができるからだ。たとえば、外出時の無線回線では頻繁に更新されるテーブルのみを同期し、社内LANではすべてのテーブルを同期するなど、複数の同期方法が利用可能になる(注14)。

注14
 このような場合、同期ユーザとパブリケーションとを指定して同期する。残念ながら、サブスクリプションで指定することはできない。

7.2.3 統合データベースの同期設定

 統合デーベースに対してMobile Linkの設定を行う。同期ロジックとなる同期スクリプトを作成する。スクリプトの説明は後述するので、4つの同期スクリプトを作成したことだけをおさえておこう。

$ type ml_consol.sql
CALL ML_ADD_TABLE_SCRIPT( 'default', 'product', 'download_cursor',
   'SELECT product_id, quantity
      FROM product'
);
CALL ML_ADD_TABLE_SCRIPT( 'default', 'product', 'upload_insert',
   'INSERT INTO product (product_id, quantity)
    VALUES (?, ?)'
);
CALL ML_ADD_TABLE_SCRIPT( 'default', 'product', 'upload_delete',
   'DELETE FROM product
     WHERE product_id = ?'
);
CALL ML_ADD_TABLE_SCRIPT( 'default', 'product', 'upload_update',
   'UPDATE product
       SET quantity = ?
     WHERE product_id = ?'
);
$ dbisql -c "dsn=consol" ml_soncol.sql

 Mobile Link用語がたくさん登場したので、ここまで行った設定項目を整理しておく。

リモートデータベース 統合データベース
・同期ユーザ……同期ユーザ名
・パブリケーション……同期対象テーブル
・サブスクリプション……Mobile LinkサーバIPなど
4つの同期スクリプト
・download_cursor
・upload_insert
・upload_delete
・upload_update

7.2.4 Mobile Linkサーバの起動

 統合データベースのODBCデータソース名を接続先として、Mobile Linkサーバを起動する。

$ dbmlsrv9 -c "dsn=consol" -o mlserver.mls -v+ -dl -za -zu+
図7.9 : Mobile Linkサーバの起動
図7.9 : Mobile Linkサーバの起動

 以上でMobile Link同期の環境は整った。いよいよ同期を実行する。

7.2.5 同期の実行

 リモートデータベースを指定して同期クライアント(dbmlsyncコマンド)を起動し、同期を開始する。

$ dbmlsync -o dbmlsync.mlc -v -c "dsn=remote"
図7.10 : 同期の実行
図7.10 : 同期の実行

 同期が完了したら、リモートデータベースの状態を確認しよう。統合データベースにあった3件のデータがリモートデータベースにダウンロードされているはずだ。

$ dbisql -c "dsn=remote" "SELECT * FROM product"
実行時間 :0.03 秒
product_id quantity
-------------------
apple      10
banana     20
carrot     30
 (最初の 3 ロー)

 今度は反対に、リモートデータベースを更新して、統合データベースにアップロードしてみよう。リモートデータベースに1件のデータを追加(INSERT)し、1件のデータを更新(UPDATE)する。

$ dbisql -c "dsn=remote" "INSERT INTO product values ('durian', 40)"
実行時間 :0 秒
1 レコードが挿入されました。
$ dbisql -c "dsn=remote" "UPDATE product SET quantity=11 WHER
E product_id='apple'"
実行時間 :0 秒
1 レコードが更新されました。

 再び同期したのち、統合データベースのデータを確認する。1件増えて、1件更新されているはずだ。

$ dbmlsync -k -o dbmlsync.mlc -v -c "dsn=remote"
$ dbisql -c "dsn=consol" "SELECT * FROM product"
実行時間 :0.03 秒
product_id quantity
-------------------
apple      11  ←更新された
banana     20
carrot     30
durian     40  ←増えた
(最初の 4 ロー)

 以上が同期実行の例である。一連の流れを整理すると、

  1. リモートデータベースには、同期ユーザ・パブリケーション・サブスクリプションを設定する
  2. 統合データベースには、同期スクリプトを登録する
  3. Mobile Linkサーバを起動する
  4. 同期クライアントを実行する

 次節では、後回しにしていた同期スクリプトの説明をする。

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

  • このエントリーをはてなブックマークに追加
SQL Anywhereの魅力を探る連載記事一覧

もっと読む

この記事の著者

森脇 大悟(モリワキ ダイゴ)

1974年生まれ。神奈川県川崎市出身。京都大学理学部物理学科卒業。同大学院 修士課程中退後、有限会社グルージェント(現・株式会社グルージェント)入社。SIとして金融や物流システムを手がける。2003年アイエニウェア・ソリューションズ株式会社入社。エンジニアとして製品の導入支援やコンサルティング業務に...

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

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1749 2008/09/04 13:01

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング