Skip to content

Java客户端 配置与扩展

He, Jiehui edited this page Sep 6, 2016 · 13 revisions

简介

dal.xml是DAL的核心配置文件,包括两大部分内容。

  1. 逻辑数据库和物理数据库如何映射的配置文件。元素databaseSets
  2. 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代表:

  1. name:逻辑数据库的名字。dal所有的操作都是依据逻辑数据库进行
  2. provider:定义逻辑数据库的提供者是那种类型的数据库,目前支持mysql和sqlserver
  3. shardingStrategy:指定分片的策略。具体如何定义请参考数据库分片的wiki

databaseSet包含一个或多个add元素,每个代表一个物理数据库,属性说明如下:

  1. name:物理数据库的代号
  2. databaseType:Master/Slave
  3. sharding:数据库分片id
  4. connectionString:物理数据库的id,用于在datasource.xml里面查找

dal.xml和datasource.xml的关系

dal.xml主要完成把逻辑数据库和物理数据库之间的映射,数据库分片的配置等工作。datasource.xml主要完成每个具体的物理数据库对应的链接属性,连接池属性的配置。这样做的好处是

  1. 使dal.xml仅包含逻辑映射和顶层组件配置,使内容尽可能简单和固定。
  2. 允许不同环境复用相同的dal.xml。只要给每个环境单独配datasource.xml,即可部署到不同环境,让环境的不同仅影响一个配置文件。
  3. 方便单独对映射或数据库连接池进行修改,避免修改大文件带来的风险。

DAL组件配置

由于每个公司的实际情况各不相同,对监控或数据库配置可能有特殊要求,因此dal实现组件化设计,以实现组件的定制或扩展。

注意

Dal已经提供了每个组件的缺省实现,如果没有特殊需求,code gen缺省生成的配置可以直接使用。无需更改。 如需定制,请参考缺省实现

DAL可以定制的组件为:

  1. DalLogger。记录DAL运行时相关信息。
  2. DalTaskFactory。细化CUD操作对应的逻辑。
  3. DalConnectionLocator。按照实际数据库标识获得连接。

每个组件的配置方式都类似。在Dal.config里面会有特定的节点和其对应。一般都是一个实现类名字加上其他配置信息。如果实现类名字未提供,系统会自动使用缺省实现。

Log配置

log相关配置在 logListener 部分,如果没有logListener部分,DAL将使用缺省的logger

logger的实现类

通过元素指定。如果没指定则使用缺省实现:

缺省实现

com.ctrip.platform.dal.dao.clien.DefaultLogger。该logger通过log4j打印log,同时支持额外选项

NULL实现

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>

配置参数

DalTaskFactory配置

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的特定实现。

ConnectionLocator配置

如果要配置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);
}
Clone this wiki locally