7.2 Getting Started
7.2.1 データベースの作成
実際に同期スクリプトを書いてMobile Linkを体験してみよう。例題として、商品テーブルの同期を取り上げる(図7.8)。商品テーブルは、商品IDと在庫数からなる単純なものだ。サーバは、統合データベース、リモートデータベースサーバ、Mobile Linkサーバの3つがある。運用環境では別々のマシンで稼働させるのが普通だが、本稿では同じマシン上で稼働しているとする。
統合データベースとリモートデータベースの作成から始める。
$ 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
$ dbisql -c "dsn=consol" %SQLANY10%\MobiLink\setup\syncsa.sql
統合データベースに対して初期データを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つの項目を設定することに注意する。
- 同期ユーザ
- パブリケーション
- サブスクリプション
$ 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
一見、3種類も設定があることは冗長なようだが、これらが柔軟な同期設定を可能にする。複数のパブリケーションと複数のサブスクリプションを作っておけば、同期対象を目的別に使い分けることができるからだ。たとえば、外出時の無線回線では頻繁に更新されるテーブルのみを同期し、社内LANではすべてのテーブルを同期するなど、複数の同期方法が利用可能になる(注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+
以上でMobile Link同期の環境は整った。いよいよ同期を実行する。
7.2.5 同期の実行
リモートデータベースを指定して同期クライアント(dbmlsyncコマンド)を起動し、同期を開始する。
$ dbmlsync -o dbmlsync.mlc -v -c "dsn=remote"
同期が完了したら、リモートデータベースの状態を確認しよう。統合データベースにあった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 ロー)
以上が同期実行の例である。一連の流れを整理すると、
- リモートデータベースには、同期ユーザ・パブリケーション・サブスクリプションを設定する
- 統合データベースには、同期スクリプトを登録する
- Mobile Linkサーバを起動する
- 同期クライアントを実行する
次節では、後回しにしていた同期スクリプトの説明をする。