2009年7月21日 星期二
2009年7月13日 星期一
2009年7月6日 星期一
Wbox
HTTP 客戶端模式
最簡單的使用方式就是把要測試的 URL 當作參數:% <b>wbox www.google.it</b> WBOX www.google.it (64.233.183.99) port 80 0. 200 OK 3774 bytes 407 ms 1. 200 OK (3767) bytes 273 ms 2. 200 OK 3767 bytes 304 ms 3. 200 OK 3767 bytes 260 ms user terminated這個模式很類似 ping。
限制請求的數量
預設 Wbox 會持續的進行遠端請求,直到使用者輸入 Ctrl+C。我們可以在傳入的 URL 後面加上一個數字指定要發出多少次請求:% <b>wbox www.google.it/notexistingpage.html 1</b><br />WBOX www.google.it (64.233.183.103) port 80<br />0. 404 Not Found 1495 bytes 310 ms<br />更多資訊請參考 http://hping.org/wbox/
於
上午11:45
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(); IListresult1 = 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 連接提供了主機、埠號、使用者名稱和密碼的設定。
就這樣...其它的使用方式就跟在本地端一模一樣。
db4o 中的 Transparent Persistence
如之前的文章提及,更新深度讓我們可以細緻化的控制物件的更新長度,以便在效能和便利上取得平衡,然而也造成下面的問題:
- 設定特定更新深度:程式碼必須知道哪些物件對應的更新深度
- 當更新深度為最大值時,會造成效能低落,沒用到的物件會被無意義的更新
- 資料庫必須組態成
TransparentPersistenceSupport
- Persistent 類別必須實做
IActivatable
介面,該介面在 db4o 的 Activation一文中有介紹。該介面提供了bind
方法取得 container 的 activator 物件。 - 當物件的欄位被修改時, db4o 的 Activation一文中提及的
Activate()
方法會被呼叫來儲存物件內容。而 db4o 的 Activation的程式碼中出現的ActivationPurpose.Write
會在 TP 中被使用。
Article
物件,我們在開啟資料庫前,先設定好 TP 支援:
Db4oFactory.Configure().Add(new TransparentPersistenceSupport());只要加上這行,再更新物件內容時,只要該物件欲更新的欄位有加上
ActivationPurpose.Write
,則會被自動儲存。
db4o 的 Activation一文中提及的主要是取出物件時的情況,這裡是儲存物件的情況
訂閱:
文章 (Atom)