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

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