[NewLife.XCode]功能設(shè)置
NewLife.XCode是一個有10多年歷史的開源數(shù)據(jù)中間件,由新生命團隊(2002~2019)開發(fā)完成并維護至今,以下簡稱XCode。
整個系列教程會大量結(jié)合示例代碼和運行日志來進行深入分析,蘊含多年開發(fā)經(jīng)驗于其中,代表作有百億級大數(shù)據(jù)實時計算項目。
開源地址:https://github.com/NewLifeX/X (求star, 652+)
連接字符串
XCode支持SqlServer、SQLite、MySql、Oracle、PostgreSQL、Access、SqlCe等多種數(shù)據(jù)庫,常用連接字符串模板如下:
<add name="SQLite" connectionString="Data Source=test.db;" providerName="Sqlite" /> <add name="MySql" connectionString="Server=.;Port=3306;Database=mysql;Uid=root;Pwd=;" providerName="MySql.Data.MySqlClient" /> <add name="MSSQL" connectionString="Server=.;User ID=sa;Password=sa;Database=Test;datapath=~\App_Data" providerName="System.Data.SqlClient" /> <add name="Oracle" connectionString="Data Source=Tcp://127.0.0.1/ORC;User ID=sys;Password=admin;Owner=mis" providerName="System.Data.OracleClient" /> <add name="PostgreSQL" connectionString="Server=.;Database=master;Uid=root;Pwd=root;" providerName="PostgreSQL.Data.PostgreSQLClient" /> <add name="MSSQL" connectionString="Server=.;Integrated Security=SSPI;Database=Test" providerName="System.Data.SqlClient" /> <add name="Oracle" connectionString="Data Source=orc;User ID=sys;Password=admin;" providerName="System.Data.OracleClient" /> <!--OLE DB Services=-1表示打開連接池--> <add name="Access" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=~\App_Data\Test.mdb;Persist Security Info=False;OLE DB Services=-1" providerName="Access"/> <add name="SqlCe" connectionString="Data Source=test.sdf;" providerName="SqlCe" />
連接字符串最常見的地方就是app.config/web.config中的connectionStrings段。
這里特別注意name,正是數(shù)據(jù)模型中講到的連接名ConnName!這個name一般取業(yè)務(wù)模塊名字,上面的名字僅僅是為了表示這是哪一種數(shù)據(jù)庫,實際項目中有用戶自己起名字。
每個數(shù)據(jù)模型生成的實體類都有一個ConnName設(shè)置,表明該實體類需要使用哪一個連接,后面是連接字符串和數(shù)據(jù)庫類型。
注意?。?!劃重點?。?!XCode實體類支持任意切換數(shù)據(jù)庫,完全由連接字符串和providerName決定所要使用的數(shù)據(jù)庫!
在這里,強烈推薦開發(fā)環(huán)境使用SQLite,生產(chǎn)環(huán)境再更換SqlServer/MySql/Oracle的連接字符串。
驗證連接的辦法也很簡單,var dal=DAL.Create(ConnName)即可!
DAL是XCode數(shù)據(jù)層總?cè)肟?,針對?shù)據(jù)庫的任何操作都通過該類橋接。
其中DAL.ConnStrs管理著所有的連接名以及對應(yīng)的連接字符串,DAL.Create(connName)時從中查找并針對連接名創(chuàng)建單一實例(每個連接名一個DAL實例)。
也可以通過DAL.AddConnStr("school", "Data Source=school.db;", null, "MySql")來動態(tài)添加連接名以及連接字符串,最后一個參數(shù)寫數(shù)據(jù)庫名。
連接字符串的第三種使用方式,也是最高級的一種,支持DAL.OnResolve委托,當(dāng)配置文件或動態(tài)配置中找不到相應(yīng)連接名時,執(zhí)行該委托。
為了集成配置中心(例如新生命團隊的開源項目星塵Stardust),一般在應(yīng)用初始化時注冊DAL.OnResolve到外部配置中心。
最后,如果沒有任何地方設(shè)置某個連接名,并且配置中心也沒有找到,XCode將會自動創(chuàng)建一個SQLite連接字符串。
因此,XCode實體類永遠不會提示找不到連接字符串,而是會自動為了創(chuàng)建SQLite連接,并且建庫建表。
配置文件
標(biāo)準(zhǔn)配置文件位于Config/XCode.config,首次使用時自動創(chuàng)建,也可以通過XCode.Setting.Current來讀寫
<?xml version="1.0" encoding="utf-8"?> <!--XCode設(shè)置--> <Setting> <!--調(diào)試--> <Debug>true</Debug> <!--輸出SQL。是否輸出SQL語句,默認啟用--> <ShowSQL>true</ShowSQL> <!--SQL目錄。設(shè)置SQL輸出的單獨目錄,默認為空,SQL輸出到當(dāng)前日志中。生產(chǎn)環(huán)境建議輸出到站點外單獨的SqlLog目錄--> <SQLPath></SQLPath> <!--SQL執(zhí)行時間。跟蹤SQL執(zhí)行時間,大于該閥值將輸出日志,默認1000毫秒--> <TraceSQLTime>1000</TraceSQLTime> <!--連接映射。連接名映射#,表名映射@,把實體類中的Test2和Test3連接名映射到Test去--> <ConnMaps></ConnMaps> <!--參數(shù)化添刪改查。默認關(guān)閉--> <UseParameter>false</UseParameter> <!--SQLite默認目錄。沒有設(shè)置連接字符串的連接默認創(chuàng)建SQLite連接,數(shù)據(jù)庫放在該目錄--> <SQLiteDbPath>..\Data</SQLiteDbPath> <!--備份目錄。備份數(shù)據(jù)庫時存放的目錄--> <BackupPath>..\Backup</BackupPath> <!--命令超時。查詢執(zhí)行超時時間,默認0秒不限制--> <CommandTimeout>0</CommandTimeout> <!--數(shù)據(jù)層緩存。默認0秒--> <DataCacheExpire>0</DataCacheExpire> <!--實體緩存過期。整表緩存實體列表,默認10秒--> <EntityCacheExpire>10</EntityCacheExpire> <!--單對象緩存過期。按主鍵緩存實體,默認10秒--> <SingleCacheExpire>10</SingleCacheExpire> <!--擴展屬性過期。擴展屬性Extends緩存,默認10秒--> <ExtendExpire>10</ExtendExpire> <!--反向工程。Off 關(guān)閉;ReadOnly 只讀不執(zhí)行;On 打開,僅新建;Full 完全,修改刪除--> <Migration>On</Migration> </Setting>
各配置項解釋:
- Debug。顧名思義,這是XCode的調(diào)試開關(guān),打開后,日志中會多寫一些東西,告訴你它正在做什么事情,分析問題的時候可以打開,如果嫌日志太少也可以打開,咱們?nèi)罩拘阅芎芎貌挥脫?dān)心;
- ShowSQL。顯示每一個執(zhí)行的SQL語句,可能是配置中最常用的一個配置項,可以在日志中明明白白看到應(yīng)用在執(zhí)行啥數(shù)據(jù)庫操作,每分鐘執(zhí)行超過30次的中大型應(yīng)用務(wù)必關(guān)閉,否則光日志就能寫爆磁盤;
- SQLPath。SQL日志默認跟普通日志放在一起,設(shè)置該相對路徑后,可以獨立存放;
-
TraceSQLTime。慢日志跟蹤時間,默認1000ms,執(zhí)行時間超過此值的SQL將輸出在日志中(常規(guī)日志,非SQL日志),對于中大型系統(tǒng)分析問題非常有用;
-
UseParameter。使用參數(shù)名查詢,默認false,設(shè)置為true時執(zhí)行的添刪改查將使用參數(shù)化操作。該參數(shù)也可以寫在連接字符串中;
-
SQLiteDbPath。沒有給連接名設(shè)置任何連接字符串時,默認生成SQLite數(shù)據(jù)庫,該設(shè)置是存放這些默認SQLite數(shù)據(jù)庫的目錄;
-
CommandTimeout。命令執(zhí)行超時時間,默認0不限制,可根據(jù)應(yīng)用需要設(shè)為15秒或30秒;
-
DataCacheExpire。數(shù)據(jù)層緩存(一級緩存)有效期,以select語句為key緩存結(jié)果數(shù)據(jù)集,任何添刪改操作或過期時清空緩存。默認0秒,web前臺網(wǎng)站建議設(shè)為10秒;
-
EntityCacheExpire。實體緩存(二級緩存)有效期,上一章有提到Meta.Cache對應(yīng)實體緩存,默認10秒,過期后繼續(xù)返回舊數(shù)據(jù)并異步更新,添刪改操作清空;
-
SingleCacheExpire。對象緩存(三級緩存)有效期,上一章有提到Meta.SingleCache,默認10秒,過期后繼續(xù)返回舊數(shù)據(jù)并異步更新,添刪改操作清空;
-
ExtendExpire。擴展屬性有效期,上一章擴展屬性部分有提到Extends帶有的緩存效果,默認10秒;
- Migration。反向工程,自動建庫建表加字段改字段等,就靠它設(shè)置。Off 關(guān)閉;ReadOnly 只讀不執(zhí)行;On 打開,僅新建;Full 完全,修改刪除。默認On僅新建,經(jīng)驗表明最合理;
連接字符串高級設(shè)置
上面的設(shè)置對整個應(yīng)用全局有效,而需要針對具體某個連接進行控制,可以把設(shè)置項寫在連接字符串中,該功能最常用的場景就是配置中心。
高級設(shè)置如下:
- ShowSQL。用法同上,針對性打開SQL日志
- UseParameter。用法同上,針對性打開參數(shù)化
- Migration。用法同上,可針對連接控制是否打開反向工程,某些只讀連接可以設(shè)置Off
- DataCache。用法同上DataCacheExpire,針對性設(shè)置當(dāng)前連接
- Readonly。該連接是否只讀,只讀連接在數(shù)據(jù)層禁止執(zhí)行Insert/Update/Delete
- TablePrefix。該連接下所有表名增加前綴,適用于多個系統(tǒng)共用一個庫,避免不同系統(tǒng)的表名重名
- Owner。擁有者,數(shù)據(jù)表所在Schema和登錄用戶不一致時,需要設(shè)置數(shù)據(jù)表所在Schema(Oracle中所屬用戶)
- Provider。提供者,數(shù)據(jù)庫類型,特用于配置中心,便于在連接字符串中指定數(shù)據(jù)庫類型
SQLite數(shù)據(jù)庫的連接字符串有特殊支持,外部沒有設(shè)置時,自動配置WAL等以極大提高性能。(提升效果可參考飛仙 http://feixian.newlifex.com )
此外,MySql和Oracle的數(shù)據(jù)源還支持 Data Source=tcp://10.0.0.3:1234/racdb 的簡寫用法。
XCode配置Debug為true時,日志會輸出調(diào)整好的最終連接字符串,可用于學(xué)習(xí)。
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門??焖僬宫F(xiàn)用法,代碼配置連接字符串
- 數(shù)據(jù)模型文件。建立表格字段和索引,名字以及數(shù)據(jù)類型規(guī)范,推薦字段(時間,用戶,IP)
- 實體類詳解。數(shù)據(jù)類業(yè)務(wù)類,泛型基類,接口
- 功能設(shè)置。連接字符串,調(diào)試開關(guān),SQL日志,慢日志,參數(shù)化,執(zhí)行超時。代碼與配置文件設(shè)置,連接字符串局部設(shè)置
- 反向工程。自動建立數(shù)據(jù)庫數(shù)據(jù)表
- 數(shù)據(jù)初始化。InitData寫入初始化數(shù)據(jù)
- 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
- 臟數(shù)據(jù)。如何產(chǎn)生,怎么利用
- 增量累加。高并發(fā)統(tǒng)計
- 事務(wù)處理。單表和多表,不同連接,多種寫法
- 擴展屬性。多表關(guān)聯(lián),Map映射
- 高級查詢。復(fù)雜條件,分頁,自定義擴展FieldItem,查總記錄數(shù),查匯總統(tǒng)計
- 數(shù)據(jù)層緩存。Sql緩存,更新機制
- 實體緩存。全表整理緩存,更新機制
- 對象緩存。字典緩存,適用用戶等數(shù)據(jù)較多場景。
- 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
- 實體工廠。元數(shù)據(jù),通用處理程序
- 角色權(quán)限。Membership
- 導(dǎo)入導(dǎo)出。Xml,Json,二進制,網(wǎng)絡(luò)或文件
- 分表分庫。常見拆分邏輯
- 高級統(tǒng)計。聚合統(tǒng)計,分組統(tǒng)計
- 批量寫入。批量插入,批量Upsert,異步保存
- 實體隊列。寫入級緩存,提升性能。
- 備份同步。備份數(shù)據(jù),恢復(fù)數(shù)據(jù),同步數(shù)據(jù)
- 數(shù)據(jù)服務(wù)。提供RPC接口服務(wù),遠程執(zhí)行查詢,例如SQLite網(wǎng)絡(luò)版
- 大數(shù)據(jù)分析。ETL抽取,調(diào)度計算處理,結(jié)果持久化

浙公網(wǎng)安備 33010602011771號