之前的Post掀起掀然大波,砸磚者紛至遝來好不熱鬧。之前的Post觀點不夠明確,準確,先say sorry,重新整理思路後再分別說明
觀點:對於一個WebApplication,提高整體吞吐能力,應該從提高單頁的響應能力開始,對於WebApplication使用上的一個原子操作:開啟一個頁面而言,在整個頁面的生存周期中開啟的資料連線數量越少,開閉的次數越少效率自然越高。
約束:頁面預設是同步的操作,我們在這裡約定再不採用非同步作業的時候,如果用非同步作業最佳化,那麼又是另外的問題了,會有其他的問題產生,比如當兩次操作有前因後果的關係的時候。
首先就是關於資料庫聯結的問題,我這裡用資料庫聯結而不用Connection就是為了滴水不漏,省得錯把關公當秦瓊把資料庫連接和.NET的XXConnection對象混淆起來。
這裡用代碼來說明,為了保證觀點的中性,我將使用NHibernate的實現來做例子。
這裡暫時委屈一下NHibernate暫時這樣子來用。
我們這裡面臨兩個問題資料庫連接的訪在那裡對象放在那裡,其二就是如何使用,如果按照一些人的觀點就是隨需開,在需要的時候開啟。比如
ISession vSession= mCfg.BuildSessionFactory().OpenSession();//建立會話工廠, 一般來說應該使用一個單例對象來封裝會話工廠.
ITransaction vTransaction = vSession.BeginTransaction();//建立事物處理
try
{
vSession.Save(vEntity);//向資料庫添加資料
vTransaction.Commit();
Labmessage.Text="OK";
}
catch(Exception ex)
{
vTransaction.Rollback();
Labmessage.Text="Error"+ex.ToString();
}
finally
{
vSession.Close();
}
這段代碼來自http://www.cnblogs.com/surprise/archive/2004/10/13/51701.aspx
一般我們會將這段代碼放進一個處理商務邏輯的對象。裡面,當需要添加一個Entity的時候調用,當然Entity有更多的用法,不過我們在這裡就對這樣子的簡單的來做第一個例子。
那麼如果我們針對這一個簡單實體封裝了一個邏輯:添加XX(使用者資訊、Post)等,當我們需要在一個頁面操作多個的時候,就會有一個問題,一個是事務,這裡我們暫且跳開不管,然後的情況就是在這個頁面頻繁的關閉開啟了多次資料庫。
這個時候我所提出的一個頁面一個Connection的方式就是指的,將:ISession vSession= mCfg.BuildSessionFactory().OpenSession();//建立會話工廠, 一般來說應該使用一個單例對象來封裝會話工廠.
ITransaction vTransaction = vSession.BeginTransaction();//建立事物處理
try
{
商務邏輯對象.操作(vSession)
vTransaction.Commit();
Labmessage.Text="OK";
}
catch(Exception ex)
{
vTransaction.Rollback();
Labmessage.Text="Error"+ex.ToString();
}
finally
{
vSession.Close();
}
這樣子的代碼寫在頁面上。
so,就是這個樣子了,在商務邏輯裡將操作做完了,以後不需要做資料庫操作的時候就將資料庫連接關閉,事務提交。
我不知道很多人是怎麼理解的。
就寫到這裡,等大蝦來拍磚,還有就是這樣子的代碼如果存線上程問題的話。那麼是不是應該對page_load方法這樣子的方法都要處理安全執行緒問題了?效率的問題不知道是頻繁關閉開啟資料庫來的有效率?一個建議,如果不在乎這點開銷的話也無所謂,如果為了結構上的清晰而讓步,這點我不反對,但是這個指標絕對是在最佳化效率的時候應該考慮到的
很多人在上一片post裡說這樣子做要我會死得很難看,我就不明白了,還有其他不死的很難看的方法?
之前Post的串連http://www.cnblogs.com/Alexander-Lee/archive/2007/03/31/694847.html