Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

SQL Anywhereにおける同期処理の基礎

SQL Anywhereの魅力を探る 8

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/12/07 16:25

目次

7.3.6 同期イベント

 同期スクリプトはイベントハンドラでもある。Mobile Linkには同期処理の過程におけるさまざまなイベントが存在し、それに対するイベントハンドラ(=同期スクリプト)が定義されていれば、それが実行される。

 たとえば、download_cursorイベントは、ダウンロードストリームを作成しようとするときに発生するイベントである。本書の例の場合、download_cursorスクリプトが存在したのでそれが実行され、productテーブルのデータがリモートデータベースに伝わった。同様に、upload_insertイベントは、アップロードストリームのデータのうち追加されたデータを処理する際に発生するイベントである。本書の例ではupload_insertスクリプトが存在したのでそのスクリプトが実行され、追加された行が統合データベースに伝わった。

 ここで取り上げた4つのイベント以外にもたくさんのイベントがある。それらに応じたスクリプトを書けば、複雑な同期ロジックを構築可能だ。イベントと同期処理の概略を擬似コードで以下に示す。イベント名はボールド体で示した。なお、この擬似コードは全体の一部であり、省略されている部分があるので、詳細はマニュアルを参照していただきたい。

 まず、Mobile Linkサーバが起動してから終了するまでの全体像を示す。

CONNECT to consolidated database
begin_connection_autocommit
begin_connection
COMMIT
<同期クライアントからの同期処理を繰り返す>
end_connection
COMMIT
DISCONNECT from consolidated database

 Mobile Linkサーバ起動時に実行したい処理があれば、この接続系のイベントを使うことになる。<同期クライアントからの同期処理を繰り返す>の部分で、同期クライアントからのリクエストを待ち受け実行する。

 1つの同期セッションは、次のように処理される。

# 接続開始
begin_synchronization
# アップロードストリームの開始
begin_upload
  for each table being synchronized {
    begin_upload_rows
    <INSERTされた行を統合データベースへupload>
    <UPDATEされた行を統合データベースへupload>
    end_upload_rows
  }
  for each table being synchronized IN REVERSE ORDER {
    begin_upload_deletes
    <DELETEされた行をupload>
    end_upload_deletes
  }
  end_upload
  upload_statistics
  COMMIT
# ダウンロードストリームの開始
begin_download
for each table being synchronized {
  begin_download_deletes
  end_download_deletes
  begin_download_rows
  <リモートデータベースへdownload>
  end_download_rows
}
modify_next_download_timestamp
end_download
COMMIT
# 接続終了
end_synchronization
Column クライアント側の同期イベント
 Mobile Linkサーバの同期イベントを説明してきたが、実は、同期クライアント(リモートデータベース)側にも同期イベントがあり、アップロードやダウンロード時のイベントフックを用いて、エラー処理などを制御できる。こちらも擬似コードで概略を示す(省略あり)。
sp_hook_dbmlsync_abort
# 同期の開始
sp_hook_dbmlsync_begin
# アップロードストリームの開始
sp_hook_dbmlsync_logscan_begin
sp_hook_dbmlsync_logscan_end
sp_hook_dbmlsync_upload_begin
sp_hook_dbmlsync_upload_end
# ダウンロードストリームの開始
sp_hook_dbmlsync_download_begin
for each table
   sp_hook_dbmlsync_download_table_begin
   sp_hook_dbmlsync_download_table_end
next table
sp_hook_dbmlsync_download_end
# 同期の終了
sp_hook_dbmlsync_end
sp_hook_dbmlsync_process_exit_code

7.3.7 同期スクリプトの自動生成

 Mobile Linkサーバには同期スクリプトを自動生成する機能がある。-zaオプションを付けてMobile Linkサーバを起動しておくと、初回同期時に以下のイベントスクリプトが自動生成されて統合データベースに保存され、そのスクリプトに従って同期が完了する(※3)。システム開発時には、自動生成された結果を出発点として、改造していけばよい。

  • upload_insert
  • upload_update
  • upload_delete
  • download_cursor
※3
 というわけで、先ほどのスクリプトをすべて手入力する必要はなく、やってしまった方、説明が遅れてすみません。

 自動生成されるにはいくつかの前提条件がある。

  • 既存の同期スクリプトがないこと
  • 既存の同期スクリプトが1つでも存在すると、自動生成されない(当然上書きもされない)。自動生成したいならば、既存の同期スクリプトをすべて削除しておく。
     
  • 同期クライアントで、カラム名を付けて同期すること
  • 同期クライアントがアップロードするのはデータだけであるが、オプションスイッチによってカラム名も送ることができる。自動生成にはカラム名が必要なため、このオプションスイッチを付けて同期クライアントを実行する。オプション名はSendColumnNamesであり、以下のように実行する。
     
    dbmlsync -e "SendColumnNames=on"
    
     
SQL Anywhere 10での機能強化
 SQL Anywhere 10では、スクリプトの自動生成機能が大幅に強化され、「Mobile Link同期ウィザード」として生まれ変わった。ウィザードにそって実現したい機能を選択すると、同期スクリプトが自動生成される。また、GUIによる細かな同期設定も可能になったので、自動生成可能な機能の範囲もかなり増えた。
 

7.3.8 Mobile Linkモニタ

 Mobile Linkモニタとは、Mobile Linkサーバの状態をリアルタイムにモニタリングするGUIツールだ(図7.15)。同期の所要時間などの情報を細かく把握できるので、同期処理のチューニングにも役立つ。Mobile Linkモニタを起動し、Mobile Linkサーバに接続すれば、その時点からずっとモニタリングしてくれる。

図7.15 : Mobile Linkモニタ
図7.15 : Mobile Linkモニタ

 図7.15の上部のグリッドでは、1行が1同期セッションを意味し、各過程の処理時間が示される。下部のグラフは、1行がMobile Linkサーバの1スレッドを意味し(合計10スレッド動作している)、1つのバーが同期セッションを表す。各過程はバー内で色分けされている。このグラフは、リアルタイムに右から左へアニメーションする。動画でお見せできないのが残念だ。

 次回は、より応用的な同期ロジックの実装例を見ていく。



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

著者プロフィール

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

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

バックナンバー

連載:SQL Anywhereの魅力を探る

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5