[NewLife.XCode]功能設定
NewLife.XCode是一個有10多年曆史的開源資料中介軟體,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。
整個系列教程會大量結合示例程式碼和執行日誌來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大資料實時計算專案。
開源地址:https://github.com/NewLifeX/X (求star, 652+)
連線字串
XCode支援SqlServer、SQLite、MySql、Oracle、PostgreSQL、Access、SqlCe等多種資料庫,常用連線字串模板如下:
<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,正是資料模型中講到的 連線名ConnName !這個name一般取業務模組名字,上面的名字僅僅是為了表示這是哪一種資料庫,實際專案中有使用者自己起名字。
每個資料模型生成的實體類都有一個ConnName設定,表明該實體類需要使用哪一個連線,後面是連線字串和資料庫型別。
注意!!!劃重點!!!XCode實體類支援任意切換資料庫,完全由連線字串和providerName決定所要使用的資料庫!
在這裡,強烈推薦開發環境使用SQLite,生產環境再更換SqlServer/MySql/Oracle的連線字串。
驗證連線的辦法也很簡單,var dal=DAL.Create(ConnName) 即可!
DAL是XCode資料層總入口,針對資料庫的任何操作都通過該類橋接。
其中DAL.ConnStrs 管理著所有的連線名以及對應的連線字串,DAL.Create(connName)時從中查詢並針對連線名建立單一例項(每個連線名一個DAL例項)。
也可以通過 DAL.AddConnStr("school", "Data Source=school.db;", null, "MySql") 來動態新增連線名以及連線字串,最後一個引數寫資料庫名。
連線字串的第三種使用方式,也是最高階的一種,支援DAL.OnResolve 委託,當配置檔案或動態配置中找不到相應連線名時,執行該委託。
為了 整合配置中心 (例如新生命團隊的開源專案星塵Stardust),一般在應用初始化時註冊DAL.OnResolve到外部配置中心。
最後,如果沒有任何地方設定某個連線名,並且配置中心也沒有找到,XCode將會自動建立一個SQLite連線字串。
因此,XCode實體類永遠不會提示找不到連線字串,而是會自動為了建立SQLite連線,並且建庫建表。
配置檔案
標準配置檔案位於Config/XCode.config,首次使用時自動建立,也可以通過XCode.Setting.Current來讀寫
<?xml version="1.0" encoding="utf-8"?> <!--XCode設定--> <Setting> <!--除錯--> <Debug>true</Debug> <!--輸出SQL。是否輸出SQL語句,預設啟用--> <ShowSQL>true</ShowSQL> <!--SQL目錄。設定SQL輸出的單獨目錄,預設為空,SQL輸出到當前日誌中。生產環境建議輸出到站點外單獨的SqlLog目錄--> <SQLPath></SQLPath> <!--SQL執行時間。跟蹤SQL執行時間,大於該閥值將輸出日誌,預設1000毫秒--> <TraceSQLTime>1000</TraceSQLTime> <!--連線對映。連線名對映#,表名對映@,把實體類中的Test2和Test3連線名對映到Test去--> <ConnMaps></ConnMaps> <!--引數化添刪改查。預設關閉--> <UseParameter>false</UseParameter> <!--SQLite預設目錄。沒有設定連線字串的連線預設建立SQLite連線,資料庫放在該目錄--> <SQLiteDbPath>..\Data</SQLiteDbPath> <!--備份目錄。備份資料庫時存放的目錄--> <BackupPath>..\Backup</BackupPath> <!--命令超時。查詢執行超時時間,預設0秒不限制--> <CommandTimeout>0</CommandTimeout> <!--資料層快取。預設0秒--> <DataCacheExpire>0</DataCacheExpire> <!--實體快取過期。整表快取實體列表,預設10秒--> <EntityCacheExpire>10</EntityCacheExpire> <!--單物件快取過期。按主鍵快取實體,預設10秒--> <SingleCacheExpire>10</SingleCacheExpire> <!--擴充套件屬性過期。擴充套件屬性Extends快取,預設10秒--> <ExtendExpire>10</ExtendExpire> <!--反向工程。Off 關閉;ReadOnly 只讀不執行;On 開啟,僅新建;Full 完全,修改刪除--> <Migration>On</Migration> </Setting>
各配置項解釋:
- Debug。顧名思義,這是XCode的除錯開關,開啟後,日誌中會多寫一些東西,告訴你它正在做什麼事情,分析問題的時候可以開啟,如果嫌日誌太少也可以開啟,咱們日誌效能很好不用擔心;
- ShowSQL。顯示每一個執行的SQL語句,可能是配置中最常用的一個配置項,可以在日誌中明明白白看到應用在執行啥資料庫操作,每分鐘執行超過30次的中大型應用務必關閉,否則光日誌就能寫爆磁碟;
- SQLPath。SQL日誌預設跟普通日誌放在一起,設定該相對路徑後,可以獨立存放;
-
TraceSQLTime。慢日誌跟蹤時間,預設1000ms,執行時間超過此值的SQL將輸出在日誌中(常規日誌,非SQL日誌),對於中大型系統分析問題非常有用;
-
UseParameter。使用引數名查詢,預設false,設定為true時執行的添刪改查將使用引數化操作。該引數也可以寫在連線字串中;
-
SQLiteDbPath。沒有給連線名設定任何連線字串時,預設生成SQLite資料庫,該設定是存放這些預設SQLite資料庫的目錄;
-
CommandTimeout。命令執行超時時間,預設0不限制,可根據應用需要設為15秒或30秒;
-
DataCacheExpire。資料層快取(一級快取)有效期,以select語句為key快取結果資料集,任何添刪改操作或過期時清空快取。預設0秒,web前臺網站建議設為10秒;
-
EntityCacheExpire。實體快取(二級快取)有效期,上一章有提到Meta.Cache對應實體快取,預設10秒,過期後繼續返回舊資料並非同步更新,添刪改操作清空;
-
SingleCacheExpire。物件快取(三級快取)有效期,上一章有提到Meta.SingleCache,預設10秒,過期後繼續返回舊資料並非同步更新,添刪改操作清空;
-
ExtendExpire。擴充套件屬性有效期,上一章擴充套件屬性部分有提到Extends帶有的快取效果,預設10秒;
- Migration。反向工程,自動建庫建表加欄位改欄位等,就靠它設定。Off 關閉;ReadOnly 只讀不執行;On 開啟,僅新建;Full 完全,修改刪除。預設On僅新建,經驗表明最合理;
連線字串高階設定
上面的設定對整個應用全域性有效,而需要針對具體某個連線進行控制,可以把設定項寫在連線字串中,該功能最常用的場景就是配置中心。
高階設定如下:
- ShowSQL。用法同上,針對性開啟SQL日誌
- UseParameter。用法同上,針對性開啟引數化
- Migration。用法同上,可針對連線控制是否開啟反向工程,某些只讀連線可以設定Off
- DataCache。用法同上DataCacheExpire,針對性設定當前連線
- Readonly。該連線是否只讀,只讀連線在資料層禁止執行Insert/Update/Delete
- TablePrefix。該連線下所有表名增加字首,適用於多個系統共用一個庫,避免不同系統的表名重名
- Owner。擁有者,資料表所在Schema和登入使用者不一致時,需要設定資料表所在Schema(Oracle中所屬使用者)
- Provider。提供者,資料庫型別,特用於配置中心,便於在連線字串中指定資料庫型別
SQLite資料庫的連線字串有特殊支援,外部沒有設定時,自動配置WAL等以極大提高效能。(提升效果可參考飛仙 http://feixian.newlifex.com )
此外,MySql和Oracle的資料來源還支援 Data Source=tcp://10.0.0.3:1234/racdb 的簡寫用法。
XCode配置Debug為true時,日誌會輸出調整好的最終連線字串,可用於學習。
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,程式碼配置連線字串
- 資料模型檔案。建立表格欄位和索引,名字以及資料型別規範,推薦欄位(時間,使用者,IP)
- 實體類詳解。資料類業務類,泛型基類,介面
- 功能設定。連線字串,除錯開關,SQL日誌,慢日誌,引數化,執行超時。程式碼與配置檔案設定,連線字串區域性設定
- 反向工程。自動建立資料庫資料表
- 資料初始化。InitData寫入初始化資料
- 高階增刪改。過載攔截,自增欄位,Valid驗證,實體模型(時間,使用者,IP)
- 髒資料。如何產生,怎麼利用
- 增量累加。高併發統計
- 事務處理。單表和多表,不同連線,多種寫法
- 擴充套件屬性。多表關聯,Map對映
- 高階查詢。複雜條件,分頁,自定義擴充套件FieldItem,查總記錄數,查彙總統計
- 資料層快取。Sql快取,更新機制
- 實體快取。全表整理快取,更新機制
- 物件快取。字典快取,適用使用者等資料較多場景。
- 百億級效能。欄位精煉,索引完備,合理查詢,充分利用快取
- 實體工廠。元資料,通用處理程式
- 角色許可權。Membership
- 匯入匯出。Xml,Json,二進位制,網路或檔案
- 分表分庫。常見拆分邏輯
- 高階統計。聚合統計,分組統計
- 批量寫入。批量插入,批量Upsert,非同步儲存
- 實體佇列。寫入級快取,提升效能。
- 備份同步。備份資料,恢復資料,同步資料
- 資料服務。提供RPC介面服務,遠端執行查詢,例如SQLite網路版
- 大資料分析。ETL抽取,排程計算處理,結果持久化