加入RUN!PC粉絲團 加入RUN!PC粉絲團
 
精選文章
分享到Plurk
分享到FaceBook
 
Windows Azure平台開發技術(2)
使用 Table Storage雲裡的資料庫
文/圖 黃忠成.責任編輯/洪羿漣

資料庫是應用程式的靈魂,大多數的應用程式都需要資料庫來儲存資料,這點即使到了雲端也是相同。Windows Azure平台提供了兩種新的服務,Storage Service與Microsoft SQL Data Services。

與傳統的應用程式相比,雲端上的應用程式需要的是一種與傳統資料庫處理完全相異的資料庫引擎,因為在雲裡,資料的儲存與搜尋是依賴多台電腦並行完成的,以往我們常用的SQL Server資料庫並不適用於雲端上,因為先天上其便不是針對雲端所設計。

為此,Azure提出了兩個嶄新的服務,一是Storage Service,二則是Microsoft SQL Data Services。前者應用在簡單的資料儲存,後者則應用在複雜、關聯式資料的儲存上。

Azure總共提供了三種Storage服務,分別是Queue(佇列)、Blob(二進位儲存)、Table (資料表),於上期文章中已介紹過Queue,Blob則是用來儲存二進位資料用,而Table則是用來儲存行列型資料,簡單的說,就是資料庫中的資料表概念實作體。

對於一般應用程式而言,Queue與Table是最重要的兩個Storage服務,前者可用於Worker Role及Web Role間的互通,後者可扮演簡單應用程式中的資料儲存要角。


使用Table Storage前的準備
使用Table Storage並不難,Microsoft 已為開發人員預先建構好一組Library,讀者們可於Azure SDK的Samples中找到一個名為StorageClient的目錄,只要參考這組Library,開發人員便可快速的建構運用Table Storage的應用程式,接下來就讓筆者引領讀者們,逐步的建構使用Table Storage的雲端應用程式吧。

首先請建立一個新的Cloud Service專案,接著在此方案中建立一個Class Library(類別庫)專案,將其命名為MyTableStorages,然後加入System.Data.Linq、System.Data.Services、System.Data.Services.Client三個參考。(圖1)

圖1:加入System.Data.Linq、System.Data.Services、System.Data.Services.Client三個參考。


完成後,於此方案中選擇加入現有專案,加入StorageClient這組Library,如圖2;接著再於剛建立的MyTableStorages專案中加入參考,參考至StorageClient專案,如圖3。

圖2:加入Library。



圖3:參考至StorageClient專案。


請特別注意一點,在Vista/Windows 7的環境下,只有系統管理員權限才能變動Program Files下的檔案,在接下來的動作裡,請記得以系統管理員權限啟動Visual Studio 2008。


建立Table Entity Class
接著開始建立Table Entity Class,在Table Storage概念中,每一個資料表對應成一個類別,每一個實體對應著一筆資料列,而每一個屬性對應著一個資料欄,當使用StorageClient這組Library時,類別必須繼承自TableStorageEntity,如程式1所示。



Table Storage並沒有實體資料庫的概念,有的是虛擬資料庫的概念,我們必須定義一個虛擬資料庫,也就是Data Context。(程式2)



C64DataServiceContext在此所扮演的是一個虛擬資料庫,與實體資料庫毫無關聯,她的存在僅是對特定資料表做邏輯性的分類而已。


產生開發時期的實體Table
至此Table Entity Class的建構動作便已完成,接著必須透過Azure SDK所提供的兩個工具,來初始化開發時期的Storage 服務及建立資料表, 請以系統管理員權限啟動Azure Command Prompt工具。(圖3)

圖3:啟動Azure Command Prompt工具。


輸入dsinit指令,此指令會在 SQL Server Express中建立開發時期Storage服務所需要的資料表,如圖4。完成後,請編譯應用程式,然後切換至MyTableStorages的bin\Debug目錄下,鍵入以下指令。

devtablegen /forceCreate /database:MyTableStorage MyTableStorages.dll


圖4:輸入dsinit指令,建立資料表。


這個指令會就提供的Assembly中所定義的Entity Class來產生資料表,以本例而言,就是產生與CustomTable類別相對應的資料表。那devtablegen是如何知道那個類別是Entity Class呢?

很簡單,只要查看程式2,讀者們便可發現其定義了一個Customers屬性,是的!devtablegen找的是DataServiceContext的子系類別,然後由此子系類別中找尋所有型別為IQueryable的屬性,最後提取其泛型參數型別來決定那個類別是Entity Class,於本例中,就是CustomerTable。

接著透過以下指令啟動Development Storage Server:
developmentstorage /database:MyTableStorage

如無誤,應可由工具列右下角找到Development Storage的圖示,點擊後可看到圖5的畫面。


圖5:Development Storage服務。



撰寫Web Role
完成這些準備動作後,現在可以開始撰寫使用Table Storage的Web Role應用程式了,在這之前,我們為CustomerTable訂製一個DataSource類別,有了這個DataSource類別,就能在ASP.NET中以ObjectDataSource為橋,將現行的ASP.NET Data UI控件與Table Storage串起來。(程式3)



完成此DataSource後,請於Default.aspx中放入ObjectDataSource控件,設定其資料來源為CustomerDataSource,並選定Select、Update、Insert、Delete所使用的函式(記得要先參考MyTableStorage這個專案)。(圖6、圖7)


圖6:參考MyTableStorage。



圖7:定義資料方法。


完成後放入一個DetailsView控件,繫結至此ObjectDataSource,並設定其DataKeyNames為CustomerID。(圖8)


圖8:DetailsView控件,繫結至此ObjectDataSource。


設定完成後,切換至原始碼,加入當資料表沒有資料時所顯示的Empty Data Template。(程式4)



一切無誤的話,便可按下F5執行應用程式,此時此雲端應用程式會執行於Development Fabric Server中,其支援資料的瀏覽及新增動作,如圖9。


圖9:執行應用程式。



上傳至Azure Services
在開發環境中測試完成後,最後的工作就是要把這個應用程式上載到雲端,而這通常是問題的開始,因為現在關於Azure的說明並不是很完善,其中有些關鍵處並未提及,以Table Storage而言,在開發環境中我們可以透過devtablegen來建立資料表,但真正的雲端並未提供這樣的工具,所以得在程式中處理資料表的建立動作,也就是呼叫TableStorage. CreateTablesFromModel函式,這通常是在Application初次被Request時執行,而撰寫此段程式碼最好的地方就是Global.asax,於此我們呼叫了CustomerDataSource的CreateTables函式,其內部則是呼叫TableStorage.CreateTablesFromModel函式建立資料表。(程式5)



準備就序後,上傳之前還得有個Storage Services帳號,如讀者尚未申請,可參考上期的文章,裡面有詳述申請此帳號的流程。有了帳號後,就只要把Storage Account Name及Share Key、Endpoint填入web.config中即可,參考圖10。


圖10:設定web.config。


最後一個步驟,只需將Visual Studio 2008所發行的檔案上傳至雲端即可。(圖11)


圖11:發行程式。





【原文刊載於RUN!PC雜誌:2009年12月號】