网络数据库的复制和同步(转摘)
數(shù)據(jù)庫復(fù)本--網(wǎng)絡(luò)數(shù)據(jù)庫的復(fù)制和同步(1)
數(shù)據(jù)庫復(fù)本是復(fù)制數(shù)據(jù)庫的技術(shù),利用這種技術(shù),可以是數(shù)據(jù)庫的幾個拷貝保持同步。數(shù)據(jù)庫的每個拷貝稱為一個復(fù)本,并且每個復(fù)本都包含一個公共的表、查詢、窗體、報表、宏和模塊的集合;每個復(fù)本還可以包含只在本地計算機上使用的本地對象。
在多用戶環(huán)境中,一個數(shù)據(jù)庫可能由多個用戶使用。在多用戶應(yīng)用程序中,數(shù)據(jù)庫復(fù)本可以改善用戶共享數(shù)據(jù)庫的途徑。用數(shù)據(jù)庫復(fù)本可以重新產(chǎn)生一個數(shù)據(jù)庫,使兩個或多個用戶同時使用自己的數(shù)據(jù)庫復(fù)本。盡管各個復(fù)本放置在不同的計算機上,但它們是保持同步的。
數(shù)據(jù)庫復(fù)本及其拓撲結(jié)構(gòu)
一個數(shù)據(jù)庫的兩個或多個以上的復(fù)本組成一個復(fù)本集,每個復(fù)本都是復(fù)本集的一部分。在復(fù)本集中含有數(shù)據(jù)庫的若干復(fù)本和設(shè)計原版(Design Master),其中設(shè)計原版是唯一能夠?qū)?shù)據(jù)庫進行設(shè)計修改的復(fù)本。同一個復(fù)本集中的復(fù)本可以相互交換數(shù)據(jù)后復(fù)制對象的更新,這種交換稱為同步。
1.數(shù)據(jù)庫復(fù)本的用途
按照傳統(tǒng)的做法,在多用戶數(shù)據(jù)庫應(yīng)用程序中,通常將表從數(shù)據(jù)庫的其它對象中分離出來,使得數(shù)據(jù)能夠駐留在網(wǎng)絡(luò)服務(wù)器上,而查詢、窗體、報表、宏以及模塊則駐留在用戶的計算機上。當需要檢索或更新數(shù)據(jù)庫中的信息時,必須先登錄到網(wǎng)絡(luò)上,然后打開計算機上的數(shù)據(jù)庫,再打開服務(wù)器上相應(yīng)的數(shù)據(jù)庫。如果使用數(shù)據(jù)庫復(fù)本技術(shù),則可以建立既包含數(shù)據(jù)又包含對象的單一數(shù)據(jù)庫。
在下列情況下,應(yīng)該使用數(shù)據(jù)庫復(fù)本:
(1)需要在各辦公室中共享數(shù)據(jù)??梢杂脭?shù)據(jù)庫復(fù)本建立一個單位的數(shù)據(jù)庫的拷貝,然后將其發(fā)送給每個相關(guān)的辦公室。用戶在每個辦公室把數(shù)據(jù)輸入到自己的復(fù)本中,并使所有的遠程復(fù)本都與單位的復(fù)本同步。下屬的各級復(fù)本能夠維護本地表,在該表中含有其它復(fù)本中的信息。
(2)需要在分散的用戶之間共享數(shù)據(jù)。各終端用戶在辦公室以外輸入到數(shù)據(jù)庫中的新信息,可以在終端與單位的網(wǎng)絡(luò)建立起電子連接的任何時候被同步。在日常工作中,終端用戶可以撥入網(wǎng)絡(luò),使復(fù)本同步,使用數(shù)據(jù)庫的當前最新版本。由于在同步期間只傳輸新增的更改,因此可以便維持數(shù)據(jù)更新所花費的時間和費用減到最小。此外,也可使用部分復(fù)本(partia1 replicas),只同步部分數(shù)據(jù)。
(3)需要提高服務(wù)器數(shù)據(jù)的可訪問性。如果應(yīng)用程序不需要立即更新數(shù)據(jù),則可以在主服務(wù)器上用數(shù)據(jù)庫復(fù)本來減少網(wǎng)絡(luò)加載。而用服務(wù)器本身的數(shù)據(jù)庫拷貝來引入第二服務(wù)器,則可以改善響應(yīng)時間。
(4)需要發(fā)布應(yīng)用程序的更新。復(fù)制應(yīng)用程序時,不僅自動復(fù)制表中的數(shù)據(jù),還要復(fù)制應(yīng)用程序的對象。如果對數(shù)據(jù)庫的設(shè)計作了更改,則Microsoft Jet數(shù)據(jù)庫引擎將在下一次同步期間傳輸這些更改,不必發(fā)布軟件的新版本。
(5)需要防止全部數(shù)據(jù)遺失。數(shù)據(jù)庫復(fù)本發(fā)布跨越多個數(shù)據(jù)庫的數(shù)據(jù),因此,當原始數(shù)據(jù)庫被破壞時,可以用復(fù)本數(shù)據(jù)庫中的某個數(shù)據(jù)庫來恢復(fù)數(shù)據(jù)。
雖然數(shù)據(jù)庫復(fù)本可以解決分布式數(shù)據(jù)庫處理中固有的許多問題,但是在下列情況下,復(fù)本仍然達不到理想要求:
1.)需要更新多個復(fù)本中的大量記錄。對于那些需要對不同復(fù)本中的現(xiàn)存記錄進行頻繁更新的應(yīng)用程序,可能會比簡單地往數(shù)據(jù)庫中插入新記錄的應(yīng)用程序產(chǎn)生更多的記錄沖突。當位于不同地點的用戶同時對同一個記錄進行修改時,將會發(fā)生記錄沖突。應(yīng)用程序的記錄沖突越多,需要的處理時間就越多,因為這些沖突只能通過手工解決。
2.)對數(shù)據(jù)一致性的要求非常嚴格。對于諸如資金過戶、航班機票的預(yù)訂以及包裹裝運的跟蹤之類的事務(wù)處理應(yīng)用程序,要求ffnu時候的信息不能有半點差錯。如果能在一個復(fù)本內(nèi)處理事務(wù),就不要在幾個復(fù)本中處理。在同步期間,各復(fù)本間交換的信息,是事務(wù)的結(jié)果,而不是事務(wù)本身。
2.復(fù)本集拓樸結(jié)構(gòu)
復(fù)本集拓撲結(jié)構(gòu)定xT復(fù)本集中各復(fù)本間的通信以及tonp同步的邏輯。復(fù)本集的拓撲結(jié)構(gòu)可以有各種不同的形式,但是對大多數(shù)的應(yīng)用程序來說,較好的拓撲結(jié)構(gòu)有兩種,即星型結(jié)構(gòu)和完全連接結(jié)構(gòu),如圖所示。
?
星型 完全連接
星型拓撲結(jié)構(gòu)有一個集線器(Hub),該集線器定期與每個衛(wèi)星復(fù)本同步。在這種拓撲結(jié)構(gòu)中,所有數(shù)據(jù)通過單個集中化數(shù)據(jù)庫在各復(fù)本之間共享。由于數(shù)據(jù)在與其它復(fù)本同步時至多只需兩步“跳躍”,所以星型拓撲結(jié)構(gòu)可以降低數(shù)據(jù)在各復(fù)本中的等待時間。
在同步期間,如果交換的平均數(shù)據(jù)量相對較小,則對大多數(shù)應(yīng)用程序來說,星型拓撲結(jié)構(gòu)可能是最有效的解決方案。它的實現(xiàn)相當簡單,而且既有效又可靠。如果是第一次實現(xiàn)復(fù)本,則最好使用星型拓撲結(jié)構(gòu)。
如果把星型拓撲結(jié)構(gòu)中的每個復(fù)本都變成一個集線器(Hub),就可以變?yōu)橥耆B接的拓撲結(jié)構(gòu)。在完全連接的拓撲結(jié)構(gòu)中,每個復(fù)本與復(fù)本集中的其它所有復(fù)本同步。完全拓撲結(jié)構(gòu)一個最重要的好處是數(shù)據(jù)傳播的等待時間小。因為每個復(fù)本與其它所有復(fù)本同步,數(shù)據(jù)可以直接發(fā)送給所有復(fù)本,而不必經(jīng)過一系列復(fù)本來間接傳播。
復(fù)本操作的對象、屬性和方法(1)--網(wǎng)絡(luò)數(shù)據(jù)庫的復(fù)制和同步(2)
與復(fù)本操作有關(guān)的對象、屬性和方法
???
???? 為了實現(xiàn)復(fù)本燥乍, Microsoft Jet數(shù)據(jù)庫引擎提供了多個對象、屬性和方法。在這一節(jié)中,將介紹與復(fù)本操作有關(guān)的對象、屬性和方法。
???? 1.Document對象和Documents集合
???? Document對象含有關(guān)于對象的一個實例的信息,對象可以是一個數(shù)據(jù)庫、表、查詢或關(guān)系(僅用于Microsoft Jet數(shù)據(jù)庫)。
???? 每個Container對象有一個包含Document對象的Documents集合(其關(guān)系詳見VB的幫助文件),這些Document對象描述由Container指定類型的內(nèi)置對象的實例。表1 列出了Document所描述的對象的類型、其Container對象的名稱及Document包含信息的類型。
???
???? Document container 包含的信息
???? 數(shù)據(jù)庫 數(shù)據(jù)庫 保存的數(shù)據(jù)庫
???? 表或查詢 表或查詢 保存的表或查詢
???? 關(guān)系 關(guān)系 保存的關(guān)系
???
???? (表1)
???
???? 用Document對象可以實現(xiàn)下列操作:
???
???? ·用Name屬性返回由用戶或Microsoft Jet數(shù)據(jù)庫引擎在建立對象時給對象所取的名字。
???? ·用Container屬性返回包含Document對象的Container對象的名稱。
???? ·用Owner屬性設(shè)置或返回對象的擁有者。為了設(shè)置owner屬性,用戶必須有對Document對象的寫權(quán)限,并且必須把userName屬性設(shè)置為一個現(xiàn)有的user或Group對象的名稱。
???? ·用UserName屬性或Permissions屬性設(shè)置或返回一個用戶或組對象的訪問權(quán)限。為了設(shè)置這些屬性,用戶必須有對Document對象的寫權(quán)限,并且必須把userName屬性設(shè)置為一個現(xiàn)有的User或GrOup對象的名稱。
???? ·用DateCreated屬性和LasUpdated屬性分別返回建立Document對象和最后修改Document對象的日期和時間。
???
???? 由于一個Document對象對應(yīng)于一個現(xiàn)有的對象,因此用戶不能建立新的Document對象或者刪除現(xiàn)有的Document對象。一個Documents集合含有多個Document對象??梢酝ㄟ^以下幾種格式引用一個Document對象:
???
???? Documents(0)
???? Documents("Name”)
???? Documents![name]
???
???? 2.container對象和Containers集合
???
???? Contalner對象把相似類型的Document對象放在一個組中。每個Database對象含有由內(nèi)部container對象組成的Containers集合。應(yīng)用程序可以定自己的文檔類型和相應(yīng)的容器(僅對Microsoft Jet數(shù)據(jù)庫),但這些對象不一定總是通過DAO支持。某些Container對象由Microsoft Jet數(shù)據(jù)庫引擎定義,也可以由其它應(yīng)用程序定義。由Microsoft Jet數(shù)據(jù)庫引擎定義的Container對象及其所包含的信息見表2
???
???? Container對象 包含的信息
???? 數(shù)據(jù)庫 保存的數(shù)據(jù)庫
???? 表 保存的表及查詢
???? 關(guān)系 保存的關(guān)系
???
???? (表2)
???
???? 說明:
???
???? 1.)每個Container對象含有由Document對象組成的Documents集合,通常用Container對象作為到Document對象中信息的直接鏈接,也可以用container集合為給定類型的Document對象設(shè)置安全性。
???
???? 2.)用Container對象可以實現(xiàn)以下操作:
???
???? ·用Name屬性返回Container對象的預(yù)定義名稱。
???? ·用Permissions和UserName屬性來設(shè)置container對象的權(quán)限;在Container對象的Documents集合中建立Document對象來繼承這些訪問權(quán)限設(shè)置。
???? ·用owner屬性設(shè)置或返回Container對象的所有者。為了設(shè)置Ower屬性,必須寫入Container對象的權(quán)限,并把屬性設(shè)置為現(xiàn)有user或Group對象的名稱。
???
???? (3)Container對象是由系統(tǒng)預(yù)定的,因此不能建立新的container對象,也不能刪除現(xiàn)有的Container對象。
???
???? (4)可以通過順序號或Name屬性設(shè)置或引用集合中的container對象,例如:
???? Containers(0)
???? Containers(”name”)
???? Containers![Name]
???
???? 【例】編寫程序,列出Tables容器中的Documents集合。
???
???? 在窗體上畫一個命令按鈕,然后編寫如下的事件過程:
???
???? Private Sub Command1_Click()
???? Dim dbsnorthwind As Database
???? Dim docloop As Document
???? Dim prploop As Property
???? Set dbsnorthwind = OpenDatabase("e:\f.mdb")
???? With dbsnorthwind.Containers!tables
???? Debug.Print "documents in " & .Name & "container"
???? 注釋:列出Table容器中的Documents集合
???? For Each docloop In .Documents
???? Debug.Print " " & docloop.Name
???? Next docloop
???? End with
???? dbsnorthwind.close
???? End sub
???
???? 該過程列出f.mdb數(shù)據(jù)庫Table容器中的Documents集合。程序運行后,單擊命令按鈕,即可在“立即”窗口中列出該集合。
復(fù)本操作的對象、屬性和方法(2)--網(wǎng)絡(luò)數(shù)據(jù)庫的復(fù)制和同步(3)
3.property對象與Properties集合
???
???? Property對象用來描述一個DAO對象的內(nèi)部屬性或用戶定義屬性,與DAO對象及Properties集合的關(guān)系為DAO對象包含Properties集合,Properties集合包含property對象。(其關(guān)系詳見VB幫助文件)
???
???? 除Connection和Error對象外,每個DAO對象都含有一個property集合,在該集合中有與相應(yīng)的DAO對象的內(nèi)部屬性一致的Property對象。同時,用戶可以定義Property對象并將其加入某些下列DAO對象的Properties集合:
???? ·Database, Index, QueryDef和TableDef對象
???? ·TableDef對象和QueryDef對象的Fields集合中的Field對象
???? Property有4個預(yù)定義的屬性:
???? ·Name屬性:是一個字符串,屬性的唯一標識。
???? ·Type屬性:是一個整型數(shù)(Integer),用來指定屬性的數(shù)據(jù)類型。
???? ·Value屬性:是一個包含屬性設(shè)置的Variant類型的值。
???? ·Inherited屬性:是一個Boolean值,用來指示屬性是否從另一個對象繼承而來。
???? Property對象既有預(yù)定義的屬性,也有用戶定義的屬性,在引用時,其格式是不一樣的。頂定義屬性的引用格式為:
???? 對象.屬性
???? 而用戶定義的屬性必須采用下面的引用格式:
???? 對象.Properties.(“屬性”)
???
???? 【例】編寫程序,列出Tables容器中的Documents集合,然后列出集合中的第一個Document對象的Properties集合。
???
???? 在窗體上畫一個命令按鈕,然后編寫如下事件過程:
???
???? Private Sub Command1_Click()
???? Dim dbsnorthwind As Database
???? Dim docloop As Document
???? Dim prploop As Property
???? Set dbsnorthwind = OpenDatabase("e:\f.mdb")
???? With dbsnorthwind.Containers!tables
???? Debug.Print "documents in " & .Name & "container"
???? For Each docloop In .Documents
???? Debug.Print " " & docloop.Name
???? Next docloop
???? With .Documents(0)
???? Debug.Print "properties of" & .Name & "document"
???? On Error Resume Next
???? For Each prploop In .Properties
???? Debug.Print " " & prploop.Name & "=" & prploop
???? Next prploop
???? On Error GoTo 0
???? End With
???? End With
???? dbsnorthwind.Close
???? End Sub
???
???? 程序的前半部分與前面的例子相同,后半部分列出第一個Document對象(即Documents(0) 的 Properties集合。運行程序,單擊命令按鈕,即可在“立即”窗口中列出上述內(nèi)容。
???
???? 用戶定義的屬性通過CreateProperty方法來定義,用該方法可以建立由用戶定義的Property對象(僅Microsoft Jet 工作區(qū)),用于Database,Document,Field,Index,QueryDef和TableDef對象。其格式為:
???
???? set property=對象.CreateProperty(name,type,value,DDL)
???
???? 各參數(shù)的含義如下:
???
???? ·property:對象變量,要建立的Property對象。
???? ·Object:對象變量,可以是Database,Field,Index,QueryDef和TableDef對象,可以對這些對象建立Property對象。
???? ·name: 可選。 variant類型(字符串子型),唯一地命名新的Property對象。
???? ·type: 可選。 常數(shù),定義新Property對象的類型。
???? ·value:可選。 variant類型,指定屬性的初值。
???? ·DDL: 可選。 Variant類型(Boolean子型),用來指示該屬性是否是一個DDl對象,缺省值為False。如果DDL為True,則不能刪除這個property 對象(除非得到 dbsecWriteDef的允許)。
???
???? 說明:
???
???? 1.)只能在一個永久對象的Property集合中建立用戶定義的Property對象。在用CreateProperty 方法建立Property對象時,如果省略了一個或多個可選參數(shù),則可在向一個集合追加新的對象之前,用賦值語句設(shè)置或重新設(shè)置相應(yīng)的屬性。在向集合中追加新的對象之后,可以改變其屬性設(shè)置的一部分(不是全部)。
???
???? 2.)如果name參數(shù)指的是該集合中已經(jīng)存在的對象成員,則當用Append方法追加時,將會出現(xiàn)錯誤。
???
???? 3.)為了從集合中刪除一個由用戶定義的屬性對象,可以用集合的Delete方法來實現(xiàn)。該方法只能刪除用戶定義的對象,不能刪除預(yù)定義屬性。
???
???? 4.)如果省略了DDL參數(shù),則缺省為False (即非DDL)。在這種情況下,沒有出現(xiàn)相應(yīng)的DDL屬性,如果需要將一個Property對象由DDL變?yōu)镈DL,則必須先刪除,然后再重新建立。
???
???? 5.)CreateProperty方法中的type參數(shù)是一個符號常量,它是Property對象的設(shè)置值或返回值,其可能的取值見表3
???
???? type參數(shù)的取值
???
???? 常數(shù) 類型 常數(shù) 類型
???? dbBigInt Big整型數(shù) dbGUID GUID
???? dbBinary 二進制 dbInteger 整型數(shù)
???? dbBoolean 布爾值 dbLong 長整型數(shù)
???? dbByte 字節(jié) dbLongBinary 長二進制(OEL對象)
???? dbChar 字符 dbMemo Memo
???? dbCurrency 貨幣 dbNumeric 數(shù)值
???? dbDate 日期/時間 dbsingle 單精度
???? dbDecimal 十進制 dbText 文本
???? dbDouble 雙精度 dbTime 時間
???? dbFloat 浮點數(shù) dbTimeStamp TimeStamp
???? dbVarBinary VarBinary
???
???? (表3)
???
???? 設(shè)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()
???? Dim dbsnorthwind As Database
???? Dim prpnew As Property
???? Dim prploop As Property
???? Set dbsnorthwind = OpenDatabase("e:\f.mdb")
???? With dbsnorthwind
???
???? 注釋:建立并添加用戶定義的屬性
???
???? Set prpnew = .CreateProperty()
???? prpnew.Name = "userdefinednew"
???? prpnew.Type = dbText
???? prpnew.Value = "this is a user_definednew property."
???? .Properties.Append prpnew
???
???? 注釋:列出當前數(shù)據(jù)庫的所有屬性
???
???? Debug.Print "properties of " & .Name
???? For Each prploop In .Properties
???? With prploop
???? Debug.Print " " & Name
???? Debug.Print " type:" & .Type
???? Debug.Print " inherited:" & .Inherited
???? End With
???? Next prploop
???? End With
???? End Sub
???
???? 上述程序建立了一個名為userdefinednew的屬性,其類型為dbText,初值為“this is a user_definednew property?!边\行程序,單擊按鈕,將建立該屬性,并在立即窗口中顯示當前數(shù)據(jù)庫的所有屬性。(包括新建立的屬性)
?
/*********************************************************
手工建庫、表等并錄下SQL語句,在程序中執(zhí)行相應(yīng)語句即可
轉(zhuǎn)載于:https://www.cnblogs.com/wlq2000/archive/2006/04/26/385789.html
總結(jié)
以上是生活随笔為你收集整理的网络数据库的复制和同步(转摘)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016-04-29 二分查找的面试题
- 下一篇: Eclipse字体颜色控制