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抽取,調度計算處理,結果持久化