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时,日志会输出调整好的最终连接字符串,可用于学习。