网络数据库的复制和同步(转摘)
數據庫復本--網絡數據庫的復制和同步(1)
數據庫復本是復制數據庫的技術,利用這種技術,可以是數據庫的幾個拷貝保持同步。數據庫的每個拷貝稱為一個復本,并且每個復本都包含一個公共的表、查詢、窗體、報表、宏和模塊的集合;每個復本還可以包含只在本地計算機上使用的本地對象。
在多用戶環境中,一個數據庫可能由多個用戶使用。在多用戶應用程序中,數據庫復本可以改善用戶共享數據庫的途徑。用數據庫復本可以重新產生一個數據庫,使兩個或多個用戶同時使用自己的數據庫復本。盡管各個復本放置在不同的計算機上,但它們是保持同步的。
數據庫復本及其拓撲結構
一個數據庫的兩個或多個以上的復本組成一個復本集,每個復本都是復本集的一部分。在復本集中含有數據庫的若干復本和設計原版(Design Master),其中設計原版是唯一能夠對數據庫進行設計修改的復本。同一個復本集中的復本可以相互交換數據后復制對象的更新,這種交換稱為同步。
1.數據庫復本的用途
按照傳統的做法,在多用戶數據庫應用程序中,通常將表從數據庫的其它對象中分離出來,使得數據能夠駐留在網絡服務器上,而查詢、窗體、報表、宏以及模塊則駐留在用戶的計算機上。當需要檢索或更新數據庫中的信息時,必須先登錄到網絡上,然后打開計算機上的數據庫,再打開服務器上相應的數據庫。如果使用數據庫復本技術,則可以建立既包含數據又包含對象的單一數據庫。
在下列情況下,應該使用數據庫復本:
(1)需要在各辦公室中共享數據??梢杂脭祿鞆捅窘⒁粋€單位的數據庫的拷貝,然后將其發送給每個相關的辦公室。用戶在每個辦公室把數據輸入到自己的復本中,并使所有的遠程復本都與單位的復本同步。下屬的各級復本能夠維護本地表,在該表中含有其它復本中的信息。
(2)需要在分散的用戶之間共享數據。各終端用戶在辦公室以外輸入到數據庫中的新信息,可以在終端與單位的網絡建立起電子連接的任何時候被同步。在日常工作中,終端用戶可以撥入網絡,使復本同步,使用數據庫的當前最新版本。由于在同步期間只傳輸新增的更改,因此可以便維持數據更新所花費的時間和費用減到最小。此外,也可使用部分復本(partia1 replicas),只同步部分數據。
(3)需要提高服務器數據的可訪問性。如果應用程序不需要立即更新數據,則可以在主服務器上用數據庫復本來減少網絡加載。而用服務器本身的數據庫拷貝來引入第二服務器,則可以改善響應時間。
(4)需要發布應用程序的更新。復制應用程序時,不僅自動復制表中的數據,還要復制應用程序的對象。如果對數據庫的設計作了更改,則Microsoft Jet數據庫引擎將在下一次同步期間傳輸這些更改,不必發布軟件的新版本。
(5)需要防止全部數據遺失。數據庫復本發布跨越多個數據庫的數據,因此,當原始數據庫被破壞時,可以用復本數據庫中的某個數據庫來恢復數據。
雖然數據庫復本可以解決分布式數據庫處理中固有的許多問題,但是在下列情況下,復本仍然達不到理想要求:
1.)需要更新多個復本中的大量記錄。對于那些需要對不同復本中的現存記錄進行頻繁更新的應用程序,可能會比簡單地往數據庫中插入新記錄的應用程序產生更多的記錄沖突。當位于不同地點的用戶同時對同一個記錄進行修改時,將會發生記錄沖突。應用程序的記錄沖突越多,需要的處理時間就越多,因為這些沖突只能通過手工解決。
2.)對數據一致性的要求非常嚴格。對于諸如資金過戶、航班機票的預訂以及包裹裝運的跟蹤之類的事務處理應用程序,要求ffnu時候的信息不能有半點差錯。如果能在一個復本內處理事務,就不要在幾個復本中處理。在同步期間,各復本間交換的信息,是事務的結果,而不是事務本身。
2.復本集拓樸結構
復本集拓撲結構定xT復本集中各復本間的通信以及tonp同步的邏輯。復本集的拓撲結構可以有各種不同的形式,但是對大多數的應用程序來說,較好的拓撲結構有兩種,即星型結構和完全連接結構,如圖所示。
?
星型 完全連接
星型拓撲結構有一個集線器(Hub),該集線器定期與每個衛星復本同步。在這種拓撲結構中,所有數據通過單個集中化數據庫在各復本之間共享。由于數據在與其它復本同步時至多只需兩步“跳躍”,所以星型拓撲結構可以降低數據在各復本中的等待時間。
在同步期間,如果交換的平均數據量相對較小,則對大多數應用程序來說,星型拓撲結構可能是最有效的解決方案。它的實現相當簡單,而且既有效又可靠。如果是第一次實現復本,則最好使用星型拓撲結構。
如果把星型拓撲結構中的每個復本都變成一個集線器(Hub),就可以變為完全連接的拓撲結構。在完全連接的拓撲結構中,每個復本與復本集中的其它所有復本同步。完全拓撲結構一個最重要的好處是數據傳播的等待時間小。因為每個復本與其它所有復本同步,數據可以直接發送給所有復本,而不必經過一系列復本來間接傳播。
復本操作的對象、屬性和方法(1)--網絡數據庫的復制和同步(2)
與復本操作有關的對象、屬性和方法
???
???? 為了實現復本燥乍, Microsoft Jet數據庫引擎提供了多個對象、屬性和方法。在這一節中,將介紹與復本操作有關的對象、屬性和方法。
???? 1.Document對象和Documents集合
???? Document對象含有關于對象的一個實例的信息,對象可以是一個數據庫、表、查詢或關系(僅用于Microsoft Jet數據庫)。
???? 每個Container對象有一個包含Document對象的Documents集合(其關系詳見VB的幫助文件),這些Document對象描述由Container指定類型的內置對象的實例。表1 列出了Document所描述的對象的類型、其Container對象的名稱及Document包含信息的類型。
???
???? Document container 包含的信息
???? 數據庫 數據庫 保存的數據庫
???? 表或查詢 表或查詢 保存的表或查詢
???? 關系 關系 保存的關系
???
???? (表1)
???
???? 用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數據庫引擎定義,也可以由其它應用程序定義。由Microsoft Jet數據庫引擎定義的Container對象及其所包含的信息見表2
???
???? Container對象 包含的信息
???? 數據庫 保存的數據庫
???? 表 保存的表及查詢
???? 關系 保存的關系
???
???? (表2)
???
???? 說明:
???
???? 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()
???? 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數據庫Table容器中的Documents集合。程序運行后,單擊命令按鈕,即可在“立即”窗口中列出該集合。
復本操作的對象、屬性和方法(2)--網絡數據庫的復制和同步(3)
3.property對象與Properties集合
???
???? Property對象用來描述一個DAO對象的內部屬性或用戶定義屬性,與DAO對象及Properties集合的關系為DAO對象包含Properties集合,Properties集合包含property對象。(其關系詳見VB幫助文件)
???
???? 除Connection和Error對象外,每個DAO對象都含有一個property集合,在該集合中有與相應的DAO對象的內部屬性一致的Property對象。同時,用戶可以定義Property對象并將其加入某些下列DAO對象的Properties集合:
???? ·Database, Index, QueryDef和TableDef對象
???? ·TableDef對象和QueryDef對象的Fields集合中的Field對象
???? Property有4個預定義的屬性:
???? ·Name屬性:是一個字符串,屬性的唯一標識。
???? ·Type屬性:是一個整型數(Integer),用來指定屬性的數據類型。
???? ·Value屬性:是一個包含屬性設置的Variant類型的值。
???? ·Inherited屬性:是一個Boolean值,用來指示屬性是否從另一個對象繼承而來。
???? Property對象既有預定義的屬性,也有用戶定義的屬性,在引用時,其格式是不一樣的。頂定義屬性的引用格式為:
???? 對象.屬性
???? 而用戶定義的屬性必須采用下面的引用格式:
???? 對象.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集合。運行程序,單擊命令按鈕,即可在“立即”窗口中列出上述內容。
???
???? 用戶定義的屬性通過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
???
???? (表3)
???
???? 設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
???
???? 注釋:列出當前數據庫的所有屬性
???
???? 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。”運行程序,單擊按鈕,將建立該屬性,并在立即窗口中顯示當前數據庫的所有屬性。(包括新建立的屬性)
?
/*********************************************************
手工建庫、表等并錄下SQL語句,在程序中執行相應語句即可
轉載于:https://www.cnblogs.com/wlq2000/archive/2006/04/26/385789.html
總結
以上是生活随笔為你收集整理的网络数据库的复制和同步(转摘)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016-04-29 二分查找的面试题
- 下一篇: SQLite数据库常用语句及MAC上的S