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" />
在NETCore中的appsettings.json是:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "Urls": "http://*:6000;https://*:6001", //"StarServer": "http://star.newlifex.com:6600", "ConnectionStrings": { "Zero": "Data Source=..\\Data\\Zero.db;Provider=SQLite", "Membership": "Data Source=..\\Data\\Membership.db;Provider=SQLite", // 各种数据库连接字符串模版,连接名Zero对应Zero.Data/Projects/Model.xml中的ConnName //"Zero": "Server=.;Port=3306;Database=zero;Uid=root;Pwd=root;Provider=MySql", //"Zero": "Data Source=.;Initial Catalog=zero;user=sa;password=sa;Provider=SqlServer", //"Zero": "Server=.;Database=zero;Uid=root;Pwd=root;Provider=PostgreSql", //"Zero": "Data Source=Tcp://127.0.0.1/ORCL;User Id=scott;Password=tiger;Provider=Oracle" //"Membership": "Server=.;Port=3306;Database=zero;Uid=root;Pwd=root;Provider=MySql", //"Membership": "Data Source=.;Initial Catalog=zero;user=sa;password=sa;Provider=SqlServer", //"Membership": "Server=.;Database=zero;Uid=root;Pwd=root;Provider=PostgreSql", //"Membership": "Data Source=Tcp://127.0.0.1/ORCL;User Id=scott;Password=tiger;Provider=Oracle" // 魔方审计日志使用Membership的连接字符串 "Log": "MapTo=Membership", "Cube": "MapTo=Membership" } }
这里特别注意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时,日志会输出调整好的最终连接字符串,可用于学习。