網路資料庫的複製和同步(轉)

gugu99發表於2007-08-13
網路資料庫的複製和同步(轉)[@more@]

  資料庫複本是複製資料庫的技術,利用這種技術,可以是資料庫的幾個複製保持同步。資料庫的每個複製稱為一個複本,並且每個複本都包含一個公共的表、查詢、窗體、報表、宏和模組的集合;每個複本還可以包含只在本地計算機上使用的本地物件。

  在多使用者環境中,一個資料庫可能由多個使用者使用。在多使用者應用程式中,資料庫複本可以改善使用者共享資料庫的途徑。用資料庫複本可以重新產生一個資料庫,使兩個或多個使用者同時使用自己的資料庫複本。儘管各個複本放置在不同的計算機上,但它們是保持同步的。

  資料庫複本及其拓撲結構

  一個資料庫的兩個或多個以上的複本組成一個複本集,每個複本都是複本集的一部分。在複本集中含有資料庫的若干複本和設計原版(Design Master),其中設計原版是唯一能夠對資料庫進行設計修改的複本。同一個複本集中的複本可以相互交換資料後複製物件的更新,這種交換稱為同步。

  1.資料庫複本的用途

  按照傳統的做法,在多使用者資料庫應用程式中,通常將表從資料庫的其它物件中分離出來,使得資料能夠駐留在網路伺服器上,而查詢、窗體、報表、宏以及模組則駐留在使用者的計算機上。當需要檢索或更新資料庫中的資訊時,必須先登入到網路上,然後開啟計算機上的資料庫,再開啟伺服器上相應的資料庫。如果使用資料庫複本技術,則可以建立既包含資料又包含物件的單一資料庫。

  在下列情況下,應該使用資料庫複本:

  (1)需要在各辦公室中共享資料。可以用資料庫複本建立一個單位的資料庫的複製,然後將其傳送給每個相關的辦公室。使用者在每個辦公室把資料輸入到自己的複本中,並使所有的遠端複本都與單位的複本同步。下屬的各級複本能夠維護本地表,在該表中含有其它複本中的資訊。

  (2)需要在分散的使用者之間共享資料。各終端使用者在辦公室以外輸入到資料庫中的新資訊,可以在終端與單位的網路建立起電子連線的任何時候被同步。在日常工作中,終端使用者可以撥入網路,使複本同步,使用資料庫的當前最新版本。由於在同步期間只傳輸新增的更改,因此可以便維持資料更新所花費的時間和費用減到最小。此外,也可使用部分複本(partia1 replicas),只同步部分資料。

  (3)需要提高伺服器資料的可訪問性。如果應用程式不需要立即更新資料,則可以在主伺服器上用資料庫複本來減少網路載入。而用伺服器本身的資料庫複製來引入第二伺服器,則可以改善響應時間。

  (4)需要釋出應用程式的更新。複製應用程式時,不僅自動複製表中的資料,還要複製應用程式的物件。如果對資料庫的設計作了更改,則Microsoft Jet資料庫引擎將在下一次同步期間傳輸這些更改,不必釋出軟體的新版本。

  (5)需要防止全部資料遺失。資料庫複本釋出跨越多個資料庫的資料,因此,當原始資料庫被破壞時,可以用複本資料庫中的某個資料庫來恢復資料。

  雖然資料庫複本可以解決分散式資料庫處理中固有的許多問題,但是在下列情況下,複本仍然達不到理想要求:

  1.)需要更新多個複本中的大量記錄。對於那些需要對不同複本中的現存記錄進行頻繁更新的應用程式,可能會比簡單地往資料庫中插入新記錄的應用程式產生更多的記錄衝突。當位於不同地點的使用者同時對同一個記錄進行修改時,將會發生記錄衝突。應用程式的記錄衝突越多,需要的處理時間就越多,因為這些衝突只能透過手工解決。

  2.)對資料一致性的要求非常嚴格。對於諸如資金過戶、航班機票的預訂以及包裹裝運的跟蹤之類的事務處理應用程式,要求ffnu時候的資訊不能有半點差錯。如果能在一個複本內處理事務,就不要在幾個複本中處理。在同步期間,各複本間交換的資訊,是事務的結果,而不是事務本身。

  2.複本集拓樸結構

  複本集拓撲結構定xT複本集中各複本間的通訊以及tonp同步的邏輯。複本集的拓撲結構可以有各種不同的形式,但是對大多數的應用程式來說,較好的拓撲結構有兩種,即星型結構和完全連線結構。

  星型拓撲結構有一個集線器(Hub),該集線器定期與每個衛星複本同步。在這種拓撲結構中,所有資料透過單個集中化資料庫在各複本之間共享。由於資料在與其它複本同步時至多隻需兩步“跳躍”,所以星型拓撲結構可以降低資料在各複本中的等待時間。

  在同步期間,如果交換的平均資料量相對較小,則對大多數應用程式來說,星型拓撲結構可能是最有效的解決方案。它的實現相當簡單,而且既有效又可靠。如果是第一次實現複本,則最好使用星型拓撲結構。

  如果把星型拓撲結構中的每個複本都變成一個集線器(Hub),就可以變為完全連線的拓撲結構。在完全連線的拓撲結構中,每個複本與複本集中的其它所有複本同步。完全拓撲結構一個最重要的好處是資料傳播的等待時間小。因為每個複本與其它所有複本同步,資料可以直接傳送給所有複本,而不必經過一系列複本來間接傳播。

  與複本操作有關的物件、屬性和方法

  為了實現複本燥乍, Microsoft Jet資料庫引擎提供了多個物件、屬性和方法。在這一節中,將介紹與複本操作有關的物件、屬性和方法。

  1.Document物件和Documents集合

  Document物件含有關於物件的一個例項的資訊,物件可以是一個資料庫、表、查詢或關係(僅用於Microsoft Jet資料庫)。

  每個Container物件有一個包含Document物件的Documents集合(其關係詳見VB的幫助檔案),這些Document物件描述由Container指定型別的內建物件的例項。表1 列出了Document所描述的物件的型別、其Container物件的名稱及Document包含資訊的型別。

  Document container 包含的資訊

  資料庫 資料庫 儲存的資料庫

  表或查詢 表或查詢 儲存的表或查詢

  關係 關係 儲存的關係

  用Document物件可以實現下列操作:

  ·用Name屬性返回由使用者或Microsoft Jet資料庫引擎在建立物件時給物件所取的名字。

  ·用Container屬性返回包含Document物件的Container物件的名稱。

  ·用Owner屬性設定或返回物件的擁有者。為了設定owner屬性,使用者必須有對Document物件的寫許可權,並且必須把userName屬性設定為一個現有的user或Group物件的名稱。

  ·用UserName屬性或Permissions屬性設定或返回一個使用者或組物件的訪問許可權。為了設定這些屬性,使用者必須有對Document物件的寫許可權,並且必須把userName屬性設定為一個現有的User或GrOup物件的名稱。

  ·用DateCreated屬性和LasUpdated屬性分別返回建立Document物件和最後修改Document物件的日期和時間。

  由於一個Document物件對應於一個現有的物件,因此使用者不能建立新的Document物件或者刪除現有的Document物件。一個Documents集合含有多個Document物件。可以透過以下幾種格式引用一個Document物件:

  Documents(0)

  Documents("Name”)

  Documents![name]

  2.container物件和Containers集合

  Contalner物件把相似型別的Document物件放在一個組中。每個Database物件含有由內部container物件組成的Containers集合。應用程式可以定自己的文件型別和相應的容器(僅對Microsoft Jet資料庫),但這些物件不一定總是透過DAO支援。某些Container物件由Microsoft Jet資料庫引擎定義,也可以由其它應用程式定義。

  Container物件 包含的資訊

  資料庫 儲存的資料庫

  表 儲存的表及查詢

  關係 儲存的關係

  說明:

  1.)每個Container物件含有由Document物件組成的Documents集合,通常用Container物件作為到Document物件中資訊的直接連結,也可以用container集合為給定型別的Document物件設定安全性。

  2.)用Container物件可以實現以下操作:

  ·用Name屬性返回Container物件的預定義名稱。

  ·用Permissions和UserName屬性來設定container物件的許可權;在Container物件的Documents集合中建立Document物件來繼承這些訪問許可權設定。

  ·用owner屬性設定或返回Container物件的所有者。為了設定Ower屬性,必須寫入Container物件的許可權,並把屬性設定為現有user或Group物件的名稱。

  (3)Container物件是由系統預定的,因此不能建立新的container物件,也不能刪除現有的Container物件。

  (4)可以透過順序號或Name屬性設定或引用集合中的container物件,例如:

  Containers(0)

  Containers(”name”)

  Containers![Name]

  【例】編寫程式,列出Tables容器中的Documents集合。

  在窗體上畫一個命令按鈕,然後編寫如下的事件過程:

    Private Sub Command1_Click()  

  Property有4個預定義的屬性:

  ·Name屬性:是一個字串,屬性的唯一標識。

  ·Type屬性:是一個整型數(Integer),用來指定屬性的資料型別。

  ·Value屬性:是一個包含屬性設定的Variant型別的值。

  ·Inherited屬性:是一個Boolean值,用來指示屬性是否從另一個物件繼承而來。

  Property物件既有預定義的屬性,也有使用者定義的屬性,在引用時,其格式是不一樣的。頂定義屬性的引用格式為:

  物件.屬性

  而使用者定義的屬性必須採用下面的引用格式:

  物件.Properties.(“屬性”)

  【例】編寫程式,列出Tables容器中的Documents集合,然後列出集合中的第一個Document物件的Properties集合。

  在窗體上畫一個命令按鈕,然後編寫如下事件過程:

    Private Sub Command1_Click()  

  使用者定義的屬性透過CreateProperty方法來定義,用該方法可以建立由使用者定義的Property物件(僅Microsoft Jet 工作區),用於Database,Document,Field,Index,QueryDef和TableDef物件。其格式為:

  set property=物件.CreateProperty(name,type,value,DDL)

  各引數的含義如下:

  ·property:物件變數,要建立的Property物件。

  ·Object:物件變數,可以是Database,Field,Index,QueryDef和TableDef物件,可以對這些物件建立Property物件。

  ·name: 可選。 variant型別(字串子型),唯一地命名新的Property物件。

  ·type: 可選。 常數,定義新Property物件的型別。

  ·value:可選。 variant型別,指定屬性的初值。

  ·DDL: 可選。 Variant型別(Boolean子型),用來指示該屬性是否是一個DDl物件,預設值為False。如果DDL為True,則不能刪除這個property 物件(除非得到 dbsecWriteDef的允許)。

  說明:

  1.)只能在一個永久物件的Property集合中建立使用者定義的Property物件。在用CreateProperty 方法建立Property物件時,如果省略了一個或多個可選引數,則可在向一個集合追加新的物件之前,用賦值語句設定或重新設定相應的屬性。在向集合中追加新的物件之後,可以改變其屬性設定的一部分(不是全部)。

  2.)如果name引數指的是該集合中已經存在的物件成員,則當用Append方法追加時,將會出現錯誤。

  3.)為了從集合中刪除一個由使用者定義的屬性物件,可以用集合的Delete方法來實現。該方法只能刪除使用者定義的物件,不能刪除預定義屬性。

  4.)如果省略了DDL引數,則預設為False (即非DDL)。在這種情況下,沒有出現相應的DDL屬性,如果需要將一個Property物件由DDL變為DDL,則必須先刪除,然後再重新建立。

  5.)CreateProperty方法中的type引數是一個符號常量,它是Property物件的設定值或返回值,其可能的取值見表3

  type引數的取值

  常數   型別   常數   型別

  dbBigInt Big整型數 dbGUID GUID

  dbBinary 二進位制 dbInteger 整型數

  dbBoolean 布林值 dbLong 長整型數

  dbByte 位元組 dbLongBinary 長二進位制(OEL物件)

  dbChar 字元 dbMemo Memo

  dbCurrency 貨幣 dbNumeric 數值

  dbDate 日期/時間 dbsingle 單精度

  dbDecimal 十進位制 dbText 文字

  dbDouble 雙精度 dbTime 時間

  dbFloat 浮點數 dbTimeStamp TimeStamp

  dbVarBinary VarBinary

  設MyDB是一個Database物件變數,MyPro是一個Property物件變數,則可以用下面的程式建立Property物件:

  set MyPro=MyDB.createProperty()

  MyPro.Name="NewDefined"

  MyPro.Type=dbText

  MyPro.Value="這是一個使用者定義的屬性"

  可以用下面的語句把新建立的屬性加到Properties集合中:

  MyDB.Properties.Append prpNew

  【例】編寫程式,建立使用者定義的Property物件,並把它加到Properties集合中。在窗體上畫一個命令按鈕,然後編寫如下的事件過程。

    Private Sub Command1_Click()   

  4.keepLocal屬性和Replicable屬性

  (1)KeepLocal屬性

  KeepLocal屬性用來保持物件的本地化,即在複製資料庫時,使指定的物件不被複制。性用於Document物件、QueryDef物件和TableDef物件。其設定或返回的值是Text類如果把該屬性設定為“T”,則在複製資料庫時可使相應的物件保持為本地物件。物件制後,不能使用KeepLocal屬性。在獲取或設定TableDef或QueryDef的KeepLocal屬性之前,必須先用CreateProperty建立,並把它附加到物件的Properties集合中。

  設定了KeepLocal屬性後,該屬性將出現在Document物件的Properties集合中。KeepLocal透過CreateProperty方法設定。例如:

    Dim dbs As Database  

  (2)Replicable屬性

  Replicable屬性用來設定或返回一個值,這個值決定資料庫或資料庫中的物件是否可以複製(僅Microsoft Jet 工作區)。該屬性用於Database物件、Document物件、QueryDef物件和TableDef物件。其設定或返回的值是Text型別。對於Database物件,如果把該屬性設定為“T”,則可以複製資料庫。設定為“T”後,就不能再改變它,如果把它設定為“F”(或其它非“T”值),則會產生錯誤。對於資料庫中的物件,如果把該屬性設定為“T”,則可複製Replicas集合中的所有Replica物件(以及對此物件的更改)。也可以在Microsoft Access的物件屬性表中設定該屬性。

  在設定一個Database,Tab1eDef或QueryDef物件的Replicable屬性前,必須先用

  CreateProperty方法建立它,並把它加入物件的Properties集合中。例如:

    sub CreateReplLocalTableX()  

    Sub SetReplicable(tdryemp As TableDeD)  

  用DAO複製資料庫的一般步驟如下:

  (1)識別資料庫中不需要複製的物件,並將它們的KeepLocal屬性設定為“T”。

  (2)將資料庫的Replicable屬性設定為“T”,使它變成設計原版。

  (3)用MakeReplica方法從設計原版中生成附加的複本。

  在設定Replicable屬性之前,應先確定在轉換資料庫以前資料庫是否已經被複制。

  1.保持物件本地化

  當把正常的資料庫轉換為設計原版時,將複製資料庫中的所有物件。如果不想把資料中的所有物件都放在複本集中,則可對不想複製的物件新增並設定KeepLocal屬性。例如,果資料庫中有一個表,在該表中含有機密的工資資訊、初始化資訊或登入到資料庫的用名,則可能希望不把這些資訊放到複本中。在這種情況下,可將該表的KeepLocal屬性設為“T”,使得複製資料庫時,這些資訊不被複制。

  對於TableDef 和 QueryDef物件,可以建立keepLocal屬性並把它新增到物件的屬性集合中。對於由主機應用程式定義的窗體、報表、宏以及模組,可以建立KeepLocal屬性並把它新增到表示該物件的Document物件的屬性集合中。

  注意,在設定keepLocal (以及Rep1icab1e )屬性之前,必須先建立它,然後新增到將使用它的物件的屬性集合中。如果在建立並新增該屬性之前先引用了它,則將產生一個執行時錯誤。

  2.使物件可以複製

  如果在複本中建立了一個新物件,並且想把它從本地的改為可複製的,使得其它使用者都可以使用它,則需要在設計原版中建立該物件,並且將其Replicab1e屬性設定為“T”。在這種情況下,務必刪除所有複本中的這個本地物件,否則會產生一個錯誤。

  對於TableDef和QueryDef物件,可以直接建立Replicab1e屬性,並新增到物件的屬性集合中,就像處理KeepLocal屬性那樣。而對於由宿主應用程式所定義的窗體、報表、宏和模組,則應建立Replicable屬性,然後新增到表示該物件的Document物件的屬性集合中。

  在下一次同步時,新的可複製物件將出現在集合的其它複本中。類似地,如果想把可複製物件改為本地物件,則應將其Replicab1e屬性設定為“F”。和KeepLocal屬性一樣,如果正在設定Replicab1e屬性的物件已經從其它物件繼承了這個屬性,則其它物件設定的值對這個物件不起作用,必須直接對每個物件設定Rep1icab1e屬性。

  注意,如果把一個物件的Replicab1e屬性從“T”改為“F”,該物件便從可複製狀態變為本地的,在這種情況下, Microsoft Jet將只在設計原版中保留該物件,而從複本集的其它複本中刪掉。在改變表的可複製狀態時,應當格外小心。即使在設計原版中暫時把一個可複製表改變為本地表,然後再改回可複製的,但下次同步時仍然將會在每個複本中刪除並重建該表。除非在進行設計變更之前同步所有的複本,否則將會丟失自上次同步以來輸入到表中的所有資料。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-954243/,如需轉載,請註明出處,否則將追究法律責任。

相關文章