-
Notifications
You must be signed in to change notification settings - Fork 0
Java客户端 配置与扩展
dal.xml是DAL的核心配置文件,包括两大部分内容。
- 逻辑数据库和物理数据库如何映射的配置文件。元素databaseSets
- DAL组件配置。元素LogListener,ConnectionLocator,TaskFactory
配置示例
<dal name="com.dal.test">
<databaseSets>
<databaseSet name="SqlServerSimpleShard" provider="sqlProvider"
shardingStrategy="class=com.ctrip.platform.dal.dao.strategy.ShardColModShardStrategy;columns=CityID,tableIndex;mod=2;">
<add name="daltestS1db" databaseType="Master" sharding="1" connectionString="SimpleShard_1"/>
<add name="daltestS0db" databaseType="Master" sharding="0" connectionString="SimpleShard_0"/>
</databaseSet>
<databaseSet name="MultiThreadingTest" provider="sqlProvider">
<add name="MultiThreadingTest" databaseType="Master" sharding="" connectionString="MultiThreadingTest"/>
</databaseSet>
<databaseSet name="MySqlSimpleShard" provider="mySqlProvider"
shardingStrategy="class=com.ctrip.platform.dal.dao.strategy.ShardColModShardStrategy;columns=CountryID;mod=2;tableColumns=CityID;tableMod=4;separator=_;shardedTables=person">
<add name="dal_shard_0" databaseType="Master" sharding="0" connectionString="dal_shard_0"/>
<add name="dal_shard_1" databaseType="Master" sharding="1" connectionString="dal_shard_1"/>
</databaseSet>
</databaseSets>
<LogListener enabled="true">
<logger>com.ctrip.platform.dal.YourDalLogger</logger>
<settings>
<encrypt>false</encrypt>
<simplified>true</simplified>
</settings>
</LogListener>
<ConnectionLocator>
<settings>
<serviceAddress></serviceAddress>
<dataSourceConfigureProvider>com.ctrip.datasource.YourProvider</dataSourceConfigureProvider>
</settings>
</ConnectionLocator>
<TaskFactory>
<factory>com.ctrip.platform.dal.dao.YourTaskFactory</factory>
</TaskFactory>
</dal>
dal通过逻辑数据库和物理数据库的映射来完成数据库shard。一个dal.xml可以包括多个逻辑数据库的定义,放在databaseSets里面。 一个逻辑数据库包括多个物理数据库并且定义sharding的策略。用databaseSet代表:
- name:逻辑数据库的名字。dal所有的操作都是依据逻辑数据库进行
- provider:定义逻辑数据库的提供者是那种类型的数据库,目前支持mysql和sqlserver
- shardingStrategy:指定分片的策略。具体如何定义请参考数据库分片的wiki
databaseSet包含一个或多个add元素,每个代表一个物理数据库,属性说明如下:
- name:物理数据库的代号
- databaseType:Master/Slave
- sharding:数据库分片id
- connectionString:物理数据库的id,用于在datasource.xml里面查找
dal.xml主要完成把逻辑数据库和物理数据库之间的映射,数据库分片的配置等工作。datasource.xml主要完成每个具体的物理数据库对应的链接属性,连接池属性的配置。这样做的好处是
- 使dal.xml仅包含逻辑映射和顶层组件配置,使内容尽可能简单和固定。
- 允许不同环境复用相同的dal.xml。只要给每个环境单独配datasource.xml,即可部署到不同环境,让环境的不同仅影响一个配置文件。
- 方便单独对映射或数据库连接池进行修改,避免修改大文件带来的风险。
由于每个公司的实际情况各不相同,对监控或数据库配置可能有特殊要求,因此dal实现组件化设计,以实现组件的定制或扩展。
Dal已经提供了每个组件的缺省实现,如果没有特殊需求,code gen缺省生成的配置可以直接使用。无需更改。 如需定制,请参考缺省实现
DAL可以定制的组件为:
- DalLogger。记录DAL运行时相关信息。
- DalTaskFactory。细化CUD操作对应的逻辑。
- DalConnectionLocator。按照实际数据库标识获得连接。
每个组件的配置方式都类似。在Dal.config里面会有特定的节点和其对应。一般都是一个实现类名字加上其他配置信息。如果实现类名字未提供,系统会自动使用缺省实现。
log相关配置在 logListener 部分,如果没有logListener部分,DAL将使用缺省的logger
通过元素指定。如果没指定则使用缺省实现:
com.ctrip.platform.dal.dao.clien.DefaultLogger。该logger通过log4j打印log,同时支持额外选项
com.ctrip.platform.dal.dao.clien.NullLogger。实现logger的接口,但什么也不干。如果不希望打任何log, 可以配置为该类。
如果用户提供的logger有特定的设置,可以在下面配置。下面的元素会按照元素名和包含的内容组成名值对来初始化logger。
示例
<LogListener enabled="true">
<logger>com.ctrip.platform.dal.YourDalLogger</logger>
<settings>
<encrypt>false</encrypt>
<simplified>true</simplified>
</settings>
</LogListener>
DalTableDao内部使用一套通用框架来处理其API上的请求。该框架会把各个CURD操作包装为request,通过对应的Task来执行执行。这样做的目的是更好的提供升级和定制操作。例如携程内部针对Sql Server,使用特殊方法来实现CUD操作。通过配置TaskFactory即可以通过DalTableDao正常的CUD接口来完成,尽管底层实现可能与通常做法不一至。
要配置TaskFactory, 只需要在元素里面指明TaskFactory的实现类即可。
并且支持在settings里面配置异步操作的最大线程数目:maxPoolSize。系统默认值是50
<TaskFactory>
<factory>com.ctrip.platform.dal.dao.YourTaskFactory</factory>
<settings>
<maxPoolSize>100</maxPoolSize>
</settings>
</TaskFactory>
如果用户提供的TaskFactory有特定的设置,可以在下面配置。下面的元素会按照元素名和包含的内容组成名值对来初始化TaskFactory的特定实现。
如果要配置locator,可在元素指定实现类。目前提供的缺省实现是com.ctrip.platform.dal.dao.datasource.DefaultDalConnectionLocator
该类支持配置dataSourceConfigureProvider。连接串解析器,缺省值为DefaultDataSourceConfigureProvider
配置示例
<ConnectionLocator>
<settings>
<dataSourceConfigureProvider>com.ctrip.datasource.YourProvider</dataSourceConfigureProvider>
</settings>
</ConnectionLocator>
DataSourceConfigureProvider 接口定义
public interface DataSourceConfigureProvider extends DalComponent {
/**
* Declare which databases we want to use.
* @param dbNames
*/
void setup(Set<String> dbNames);
/**
* Return null if no such config is found
* @param dbName
* @param option addition option for setup connection URL
* @return
*/
DataSourceConfigure getDataSourceConfigure(String dbName);
}