在高并發的系統中,我們常采用多數據庫分散放置、讀寫分離、細粒度的隔離級別設定等策略來提高系統的性能。 DataRabbit3.3 以及以上版本對這三種策略都給予了內置的支持。
(1)數據庫分散放置:對于較大型的系統,在設計數據庫時,我們可以根據業務范圍將其設計為多個數據庫,而不是一個,然后將這些數據庫部署在不同的物理服務器上,以分擔負載。當然,如果已經設計好的數據庫,也可以采用水平分區或垂直分區的方式來達到類似的效果。
(2)讀寫分離:在高性能的系統中,這是最常采用的策略。在SqlServer中,可以采用事務型的訂閱/發布模型來實現這種策略。在這種策略中,有一個Master DB 和多個(或一個)Slave DB,其中所有的Slave DB是只讀的,而Master DB支持讀寫,當Master DB中的數據發生變化時,所有Slave DB會自動與其同步(可能會有稍微的延遲)。
(3)細粒度的隔離級別:比如,對于某些要求不高的查詢可以采用ReadUncommitted的隔離級別來讀取數據。
DataRabbit.Application. TransactionScopeFactoryProvider <TSourceKey,TSlaveSuitKey> 類可以支持數據庫分散放置和讀寫分離。它支持【1套主/N套從】數據庫實例。 【一套】表示支持一個系統運行的不可或缺的相互協作的多個數據庫。
TransactionScopeFactoryProvider 類圖結構如下所示:
其中泛型參數 TSourceKey 是用來表示數據源標志的類型,比如我們可以用字符串來為每個數據庫(數據源)命名,那么TSourceKey便可使用string類型。
泛型參數 TSlaveSuitKey 是用來表示每套從庫的【套標志】的類型,比如,我們每套Slave庫中包含5個數據庫(這與Master中的5個是一一對應的),而我們可以提供比如3套Slave庫以支持超大負載的數據讀取,于是我們就要為這三套Slave庫加以不同的標志以區分。
其中有用于注入Master DB數據庫連接信息的Dictionary屬性: MasterDataConfigurationDictionary ,鍵便是TSourceKey類型,是每個數據源的標志,其值是用于封裝數據庫連接信息的DataConfiguration,這個類大家已經很熟悉了。而SlaveSuitDictionary用于注入多套從庫的數據庫連接信息。當然你已經知道, MasterDataConfigurationDictionary 和 SlaveSuitDictionary中每一套的項是一一對應的。還有一個小技巧,如果你現在的系統還不夠大,但是以后會采用倒讀寫分離策略,那么暫時你可以將Master和Slave配置為指向同一個數據庫,這是沒有問題的,等系統做大了以上,需要Slave的支持時,只要修改一下配置即可。
DBOperationLogger屬性用于記錄數據庫的所有操作和訪問產生的異常信息。如果不設置,則表示不記錄這些信息,關于DBOperationLogger的介紹,可以參考 這里 。
接下來我們再看GetFactory方法:
其第一個參數表示要訪問哪個數據庫,第二個參數表示是要訪問Master庫還是Slave庫。我們要注意到,當系統采用多套從庫時,GetFactory()方法會隨機的返回某套從庫的TransactionScopeFactory,從而達到自動負載均衡的目的。 當然你也可以通過GetSlaveFactory()方法來返回指定標志的某套從庫的TransactionScopeFactory。
如此,我們可以這樣來使用讀寫分離機制 -- 比如,我們有一個任務只是讀取數據庫,而不會有任何修改行為,那么就從Slave庫中讀?。?
TransactionScopeFactory factory = this .transactionScopeFactoryProvider.GetFactory( DBSourceType .Basic, false );
using ( TransactionScope scope = factory.NewTransactionScope( false ))
{
IOrmAccesser < Student > accesser = scope.NewOrmAccesser < Student > ();
list = accesser.GetAll();
scope.Commit();
}
return list;
這個例子中,我們用一個枚舉 DBSourceType 來標志多個數據源,例子從標志位Basic的數據源的Slave庫中讀取所有的Student列表信息。
接下來,我們來看對隔離級別的支持。
還是使用上面的這個例子,假設我們的業務允許讀取Student列表可以為臟讀,那么可以降低讀取的隔離級別(默認為ReadCommitted):
TransactionScopeFactory factory = this .transactionScopeFactoryProvider.GetFactory( DBSourceType .Basic, false );
using ( TransactionScope scope = factory.NewTransactionScope( false, IsolationLevel.ReadUncommitted ))
{
IOrmAccesser < Student > accesser = scope.NewOrmAccesser < Student > ();
list = accesser.GetAll();
scope.Commit();
}
return list;
IsolationLevel定義如下:
{
ReadUncommitted = 0 ,
ReadCommitted,
RepeatableRead,
Serializable
}
DataRabbit3.3及以上版本對上述策略都給予了充分的支持,你可以下載 最新版本 試試。
關于DataRabbit的更多信息目錄,參見 這里 。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
