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
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
自動生成されるにはいくつかの前提条件がある。
- 既存の同期スクリプトがないこと
- 同期クライアントで、カラム名を付けて同期すること
dbmlsync -e "SendColumnNames=on"
7.3.8 Mobile Linkモニタ
Mobile Linkモニタとは、Mobile Linkサーバの状態をリアルタイムにモニタリングするGUIツールだ(図7.15)。同期の所要時間などの情報を細かく把握できるので、同期処理のチューニングにも役立つ。Mobile Linkモニタを起動し、Mobile Linkサーバに接続すれば、その時点からずっとモニタリングしてくれる。
図7.15の上部のグリッドでは、1行が1同期セッションを意味し、各過程の処理時間が示される。下部のグラフは、1行がMobile Linkサーバの1スレッドを意味し(合計10スレッド動作している)、1つのバーが同期セッションを表す。各過程はバー内で色分けされている。このグラフは、リアルタイムに右から左へアニメーションする。動画でお見せできないのが残念だ。
次回は、より応用的な同期ロジックの実装例を見ていく。