支持c#的分表分库组件-Ctrip DAL
簡介
Ctrip DAL是攜程框架部開發(fā)的數(shù)據(jù)庫訪問框架,支持代碼生成和水平擴展。其由攜程技術(shù)中心框架部DAL團隊開發(fā),歷經(jīng)3年不斷打磨,并在長期的實際使用中基于大量的用戶反饋不斷優(yōu)化。
開源范圍包括代碼生成器,Java客戶端和C#客戶端。
背景
隨著企業(yè)規(guī)模擴張和業(yè)務(wù)量的急劇增加,作為系統(tǒng)核心的數(shù)據(jù)庫相關(guān)開發(fā)也會經(jīng)歷一個由單一團隊發(fā)展為多團隊;由單機擴張到集群;由單數(shù)據(jù)庫發(fā)展為多數(shù)據(jù)庫;由采用單一數(shù)據(jù)庫產(chǎn)品到多種數(shù)據(jù)庫產(chǎn)品并存的過程。伴隨這一過程的是如何管理數(shù)據(jù)庫擴展,如何規(guī)范數(shù)據(jù)庫訪問,如何保護數(shù)據(jù)庫投資,如何應(yīng)對訪問量增加,如何預(yù)防安全問題等一系列挑戰(zhàn)。作為中國在線旅游行業(yè)的翹楚,攜程也曾經(jīng)面對同樣困擾。為了應(yīng)對這些挑戰(zhàn),實現(xiàn)企業(yè)10倍速發(fā)展,攜程開發(fā)了具有自己特色的數(shù)據(jù)庫訪問框架Ctrip DAL。
Ctrip DAL支持流行的分庫分表操作,支持Java和C#,支持Mysql和MS SqlServer。使用該框架可以在有效地保護企業(yè)已有數(shù)據(jù)庫投資的同時,迅速,可靠的為企業(yè)提供數(shù)據(jù)庫訪問層的橫向擴展能力。整個框架包括代碼生成器和客戶端。工作模式是使用代碼生成器在線生成代碼和配置,通過DAL客戶端完成數(shù)據(jù)庫操作。生成器具有豐富的向?qū)е敢?#xff0c;操作簡單清晰,即可以批量生成標準DAO,也可以在方法級別定制數(shù)據(jù)庫訪問。客戶端則可以簡單的通過標準的maven方式添加依賴。
Ctrip DAL與一般數(shù)據(jù)庫框架最大的不同是從企業(yè)跨部門的角度,統(tǒng)一管理數(shù)據(jù)庫相關(guān)資源。通過部署代碼生成器,企業(yè)可以做到有效的管理全公司的DAL開發(fā)團隊,明確數(shù)據(jù)庫歸屬和定制數(shù)據(jù)庫訪問。通過代碼生成器生成的標準DAO代碼與客戶端配合使用,可以大幅提高工作效率,保證代碼質(zhì)量。解決了業(yè)內(nèi)常見的伴隨業(yè)務(wù)成長而帶來的系統(tǒng)維護困難,開發(fā)效率低下,代碼風格五花八門,代碼質(zhì)量參差不齊等痛點問題。
代碼生成器
代碼生成器允許用戶創(chuàng)建Dal團隊,組織開發(fā)人員,管理數(shù)據(jù)庫,創(chuàng)建DAO并生成代碼和配置。與一般基于JDBC driver的DB sharding產(chǎn)品不同的是,代碼生成器生成的代碼和配置可以直接拿來實用,完全無需用戶寫一行代碼和配置。做到了只需開發(fā)人員關(guān)心業(yè)務(wù)邏輯,而把繁瑣的數(shù)據(jù)庫相關(guān)的編碼和配置任務(wù)全部交給DAL。由于Ctrip DAL完全在DAO這層工作,也沒有什么這種SQL語句不支持,那種SQL語句不能用的情況。同時傳遞hints的方式也非常自然,每個方法都自帶hints的接口,需要DAL額外做什么可以直接按給定的已有名字來設(shè)置,無需改寫原始的sql來添加怪異的注釋。
客戶端簡介
客戶端配合代碼生成器生成的代碼來完成用戶的數(shù)據(jù)庫訪問操作。通過Dev和QA兩方面雙重自動化測試來保障質(zhì)量,覆蓋率達到99%,并經(jīng)過生產(chǎn)實際實用的的長期嚴格檢驗。為了適應(yīng)不同公司的實際情況,DAL客戶端定義了豐富的擴展接口,覆蓋了從數(shù)據(jù)源管理,數(shù)據(jù)庫映射,連接串讀取到自定義訪問方式等等方方面面的功能。同時為了方便系統(tǒng)監(jiān)控還內(nèi)置了系統(tǒng)狀態(tài),日志和統(tǒng)計模塊。
C#客戶端 API列表
以下這些API位于BaseDao類中 方法族說明:除了所示的方法之外,至少還包含一個帶有IDictionary hints參數(shù)的重載方法。
注意:增刪改均適用的API被歸類至Update系列
CreateObject?Insert<T>(T?obj)?where?T?:?class,?new()?方法族 Object?InsertByComplexPk<T>(T?obj)?where?T?:?class,?new()?方法族 Boolean?BulkInsert<T>(IList<T>?list)?where?T?:?class,?new()?方法族 Retrieve IQuery<T>?GetQuery<T>()?where?T?:?class,?new() IList<T>?GetAll<T>()?where?T?:?class,?new()?方法族 IList<T>?SelectListOfSingleField<T>(String?sql)?方法族 IList<T>?SelectList<T>(String?sql)?where?T?:?class,?new()?方法族 IList<T>?SelectList<T>(IQuery?query)?where?T?:?class,?new()?方法族 IList<T>?SelectListByAdapter<T>(String?sql)?where?T?:?class,?new()?方法族 IList<T>?SelectListByAdapter<T>(IQuery?query)?where?T?:?class,?new()?方法族 IList<T>?ExecListBySp<T>(String?procName,?StatementParameterCollection?parameters)?where?T?:?class,?new()?方法族T?GetByKey<T>(Object?key)?where?T?:?class,?new()?方法族T?SelectFirst<T>(String?sql)?where?T?:?class,?new()?方法族T?SelectFirst<T>(IQuery?query)?where?T?:?class,?new()?方法族T?VisitDataReader<T>(String?sql,?Func<IDataReader,?T>?callback)?方法族T?VisitDataReaderBySp<T>(String?procName,?StatementParameterCollection?parameters,?Func<IDataReader,?T>?callback)?方法族DataTable?SelectDataTable(String?sql)?方法族DataTable?ExecDataTableBySp(String?procName,?StatementParameterCollection?parameters)?方法族DataSet?SelectDataSet(String?sql)?方法族DataSet?SelectDataSet<T>(IQuery?query)?where?T?:?class,?new()?方法族DataSet?ExecDataSetBySp(String?procName,?StatementParameterCollection?parameters)?方法族IDataReader?SelectDataReader(String?sql)?方法族IDataReader?ExecDataReaderBySp(String?procName,?StatementParameterCollection?parameters)?方法族Object?ExecScalar(String?sql)?方法族Object?ExecScalarBySp(String?procName,?StatementParameterCollection?parameters)?方法族UpdateInt32?Update<T>(T?obj)?where?T?:?class,?new()?方法族IUpdatePartial<T>?GetUpdatePartially<T>()?where?T?:?class,?new()Int32?UpdatePartially<T>(IUpdatePartial<T>?partially,?T?obj)?where?T?:?class,?new()?方法族Int32?ExecNonQuery(String?sql)?方法族void?ExecSp(String?procName,?StatementParameterCollection?parameters)?方法族DeleteInt32?Delete<T>(T?obj)?where?T?:?class,?new()?方法族https://github.com/ctripcorp/dal
總結(jié)
以上是生活随笔為你收集整理的支持c#的分表分库组件-Ctrip DAL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scott Hanselman 喊你来看
- 下一篇: dotnet中的counter