通用連接和事務管理方法
連接和事務管理是使用數據庫的應用程序最重要的概念之一。當你開啟一個數據庫連接,什么時候開始事務,如何釋放連接...諸如此類的。
正如大家都知道的,.Net使用連接池(connection pooling)。因此,創建一個連接實際上是從連接池中取得一個連接,會這么做是因為創建新連接會有成本。如果沒有任何連接存在于連接池中,一個新的連接對象會被創建并且添加到連接池中。當你釋放連接,它實際上是將這個連接對象送回到連接池。這并不是實際意義上的釋放。這個機制是由.Net所提供的。因此,我們應該在使用完之后釋放掉連接對象。這就是最佳實踐。
在應用程序中,有兩個通用的方來創建/釋放一個數據庫連接:
第一個方法:在Web請求到達的時候,創建一個連接對象。(Application_BeginRequest這個位于global.asax中的事件),使用同一個連接對象來處理所有的數據庫操作,并且在請求結束的時候關閉/釋放這個連接 (Application_EndRequest事件)。
這是個簡易但卻沒效率的方法,原因:
或許這個Web請求不需要操作數據庫,但是連接卻會開啟。這對于連接池來說是個毫無效率的使用方式。 這可能會讓Web請求的運行時間變長,并且數據庫操作還會需要一些執行。這也是一種沒效率的連接池使用方式。 這對于Web應用來說是可行的。如果你的應用程序是Widnows Service,這可能就無法被實現了。 同樣的這是一個使用事務式的數據庫操作最佳場景。如果有一個操作發生失敗,所有的操作都會回滾。因為事務會鎖住數據庫中的一些數據列(事件數據表),它必定要是短暫的。第二個方法: 創建一個連接當需要的時候(只要在使用它之前)并且釋放它在使用它之后。這是相當高效的,但是就得乏味而且反復的去進行(創建/釋放連接)。
ABP的連接和事務管理
ABP綜合上述兩個連接管理的方法,并且提供一個簡單而且高效的模型。
1.倉儲類(Repository classes)
倉儲是主要的數據庫操作的類。ABP開啟了一個數據庫連接并且在進入到倉儲方法時會啟用一個事務。因此,你可以安全地使用連接于倉儲方法中。在倉儲方法結束后,事務會被提交并且會釋放掉連接。假如倉儲方法拋出任何異常,事務會被回滾并且釋放掉連接。在這個模式中,倉儲方法是單元性的(一個工作單元unit of work)。ABP在處理上述那些動作都是全自動的。在這里,有一個簡單的倉儲:
public class ContentRepository : NhRepositoryBase<Content>, IContentRepository{ public List<Content> GetActiveContents(string searchCondition) { var query = from content in Session.Query<Content>() where content.IsActive && !content.IsDeleted select content; if (string.IsNullOrEmpty(searchCondition)) { query = query.Where(content => content.Text.Contains(searchCondition)); } return query.ToList(); }}
新聞熱點
疑難解答
圖片精選