程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> 實例介紹一個相對復雜的MobiLink例子

實例介紹一個相對復雜的MobiLink例子

編輯:SyBase綜合文章

具體步驟:

1.需要兩個ASA的數據庫。在命令行方式下,分別鍵入

 

dbinit con1.db 
dbinit rem1.db

 

 

 

 

con1這個數據庫代表中心數據庫,rem1代表遠程數據庫,我們把中心數據庫的數據通過MobiLink同步到rem1來。

 

2.中心數據庫裡面需要數據

 

在dbisql下,連接con1數據庫(連接方法不會發帖子問啊,或者下載文檔看)

 

輸入命令:

 

對con1建表:

 

CREATE TABLE dept 
( 
deptno CHAR(4) NOT NULL PRIMARY KEY, 
deptname VARCHAR(10) NOT NULL 
); 


CREATE TABLE employee 
( 
empno CHAR(5) NOT NULL PRIMARY KEY, 
empname VARCHAR(20) NOT NULL, 
deptno CHAR(4) NOT NULL, 
FOREIGN KEY (deptno) REFERENCES dept(deptno) 
);

 

 

 

對con1添加數據:

 

INSERT INTO dept VALUES('0001', 'admin'); 
INSERT INTO dept VALUES('0002', 'finance'); 
INSERT INTO dept VALUES('0003', 'sales'); 
INSERT INTO dept VALUES('0004', 'presales'); 
INSERT INTO dept VALUES('0005', 'marketing'); 
INSERT INTO dept VALUES('0006', 'CS&S'); 
INSERT INTO dept VALUES('0007', 'ADO'); 

COMMIT; 

INSERT INTO employee VALUES('31274', 'Johnson Zhang', '0005'); 
COMMIT;

 

 

 

 

OK。然後再連接上rem1數據庫,也要建表,但是不要數據:

 

CREATE TABLE employee 
( 
empno CHAR(5) NOT NULL PRIMARY KEY, 
empname VARCHAR(20) NOT NULL, 
deptno CHAR(4) NOT NULL, 
);

 

 

我們要做的是一個雙向同步的例子,也就是說con1和rem1的數據更改在同步後都會在兩端保持一致。

 

2.ODBC管理器

分別建立對兩個數據庫的ODBC連接,名為“cons”和“rem1”。

 

3.在dbisql下,連接到rem1數據庫,並建立發布

 

CREATE PUBLICATION demo1 
( 
TABLE employee 
);

 

a. 發布的含義是什麼呢?大家灌水回答問題,獲贈圖書!

 

b. 如果我還想發布其他的表怎麼辦呢?

 

c. 如果我只想發布employee表中的前兩列,並且是empno大於40000的數據怎麼辦呢?

 

答案可以在《MobiLink 服務器啟動同步用戶指南》中尋找。

 

 

4.創建同步用戶

 

在dbisql下,

CREATE SYNCHRONIZATION USER "51";

 

 

 

 

5.建立訂閱

 

 

 

在dbisql下, 

CREATE SYNCHRONIZATION SUBSCRIPTION  
TO "demo1" 
FOR "51" 
TYPE 'TCPIP' 
ADDRESS 'host=localhost;port=2439' 
OPTION ScriptVersion='demo1';

 

 

6.三件事情

 

a. 搭建了中心數據庫(con1)。包含建立ODBC

b. 搭建了遠程數據庫(rem1)。包含建立ODBC

c. 在遠程數據庫上定義發布、同步用戶和訂閱

 

因為MobiLink可支持ASA/UltraLite(遠程端)和任何符合ODBC標准的數據源同步,所以要建立ODBC。當然,ASA 10(還沒有發布呢)可以支持跟任何數據源的同步(XML、Excel、文本文件等)。

 

定義的發布指的是我們標定遠程數據庫的哪些表及其這些對這些表的相關投影和選擇後的數據是需要同步的。

 

訂閱可以讓中心服務器與遠程數據庫的數據按照定義的訂閱規則交互。

 

MobiLink是先做上載的,也就是說先把遠程的數據上載到服務器端,當然你也可以不做上載。

MobiLink在做完上載後做下載,也就是把服務器端的數據下載到遠程數據庫上,這樣就保持了con1和rem1兩個數據庫的一致。

 

另外,MobiLink在做上載的時候是做僅更改的數據,也就是做增量上載,做下載的時候需要一些技巧來完成增量下載,本次主題不討論這個問題。

 

對於上載和下載來說,都是通過一些在中心數據庫的事件來實現的。這些典型的事件包括:

 

upload_insert事件

upload_update事件

upload_delete事件

 

download_cursor事件

等等。

 

在這裡我們僅介紹這幾個事件。

 

對於upload開頭的,肯定都是上載事件了。當遠程服務器(rem1)和中心服務器(con1)通過MobiLink連接的時候,也就是MobiLink客戶端與MobiLink服務器連接了之後,MobiLink客戶端根據發布定義創建上載流。

 

如果在同步與同步期間,符合發布定義的數據有了改變,這些改變後的數據就會包含在上載流中。上載流通過MobiLink到達中心服務器,進而通過upload_insert, upload_update和upload_delete事件控制這些數據的走向。

 

比如,在這個例子中,我們可以在dbisql下,分別應用ml_add_table_script存儲過程來完成對三個事件的定義:

 

call ml_add_table_script( 'demo1', 'employee', 
'upload_insert','INSERT INTO employee( empno, 
empname, deptno) VALUES (?, ?, ?)') 

call ml_add_table_script('demo1', 'employee', 
'upload_update', 'UPDATE employee SET deptno=?, 
empname=? WHERE empno=?') 

call ml_add_table_script('demo1', 'employee',
 'upload_delete', 'DELETE employee WHERE empno=?')

 

 

 

這樣的話,上載上來的數據就可以按照這三個事件的要求進入中心數據庫了。當然,你可以根據自己的要求改變這三個事件中的SQL語句。demo1作為版本編號來講非常重要,他要與客戶端的訂閱中的版本號一致。

 

然後,上載完成了。MobiLink服務器就會根據download_cursor事件的要求來組織下載,下載的數據傳到MobiLink客戶端後會應用到遠程數據庫。

 

call ml_add_table_script('demo1', 'employee', 
'download_cursor', 'SELECT empno, empname, 
deptno FROM employee')

 

 

 

這條語句定義了download_cursor事件,這個事件中的結果集將下載並應用到遠程數據庫。

 

所以,這樣的話,整個同步的搭建工作就差不多了,接下來,我們就啟動同步服務器並觸發同步。

 

7.啟動同步服務器

 

在cmd下

 

dbmlsrv9 -dl –v+ –zu+ -x 
tcpip -c "DSN=cons" –ot ml.txt

這樣,MobiLink服務器就啟動了,同時也不像簡單的那個例子一樣,它不支持自動生成腳本,因為腳本我們已經定義了。本命令在con1所在的計算機上執行。

 

觸發同步:

在cmd下

 

DBMLSync –c "dsn=rem1" 
–v –dl  –o rem1.txt

 

本命令在rem1所在計算機上執行。這樣的話呢,我們就從客戶端觸發了一次同步,對數據進行了同步。

在同步完成後,可以關閉DBMLSync所開啟的窗口,把中心和遠程的數據都更改一下,再次DBMLSync。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved