2009年6月28日 星期日

db4o client/server 模式

從 db4o 的 API 來看,要存取遠端資料庫伺服器跟本地端直接開啟資料庫伺服器以支援同時存取(concurrent transaction)的方法幾乎沒有甚麼不同。要使用同時存取,只要把原本開啟資料庫檔案的方式改換成開啟 db4o 伺服器的模式,並將其啟動於 port 0 即可(因而不需要任何的網路連線):
IObjectServer server = Db4oFactory.OpenServer("db.filename", 0);
try
{
    IObjectContainer client = server.OpenClient();
    // 讓 client 端做某些事情
    // ...
    client.Close();
}
finally
{
    server.Close();
}
在 db4o 中,client 端的 transaction 只處於 read commit(不過每個 client container 都維護一個 weak 參考快取,參考到它所有已知、參考到的物件)。要讓所有 client 端中未決的更新 comment 立即執行,我們可以明確的自伺服器中的更新已知的物件:
IObjectContainer client1 =server.OpenClient();
IObjectContainer client2 =server.OpenClient();
IList
result1 = client1.Query
(delegate(Article art) { return art.PMID == "7533967" && art.GM_Version == GeneMentionTagger.VERSION; }); IList
result2 = client2.Query
(delegate(Article art) { return art.PMID == "7533967" && art.GM_Version == GeneMentionTagger.VERSION; }); Article a = result1.Next(); // 修改 a 的內容 client1.Store(a); client2.Ext().Refresh(a,Int16.MaxValue); // 取得更新後的內容 client1.Commit();

遠端資料庫伺服器

要讓 db4o 能夠使用 TCP/IP 網路存取遠端的資料庫方法很簡單,只要指定連接埠大於零,並且設定一至多個 client 即可!
IObjectServer server = Db4oFactory.OpenServer("db_filename",
655);
server.GrantAccess("user", "passwd");
try
{
    IObjectContainer client = Db4oFactory.OpenClient("localhost",
    655, "user", "passwd");
    // Do something with this client, or open more clients
    client.Close();
}
finally
{
    server.Close();
}

如上例所示,client 連接提供了主機、埠號、使用者名稱和密碼的設定。

就這樣...其它的使用方式就跟在本地端一模一樣。

沒有留言: