Commit a4a1a00c authored by haocao's avatar haocao
Browse files

fix #58

parent 070ae9a0
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -9,8 +9,7 @@
    <modules>
        <module>sharding-jdbc-core</module>
        <module>sharding-jdbc-config-parent</module>
        <module>sharding-jdbc-transaction</module>
        <module>sharding-jdbc-transaction-async-job</module>
        <module>sharding-jdbc-transaction-parent</module>
    </modules>

    <properties>
@@ -47,7 +46,10 @@
        <unitils.core.version>3.4.2</unitils.core.version>
        <mockito.version>1.10.19</mockito.version>
        <hamcrest.version>1.3</hamcrest.version>
        <gson.version>2.6.1</gson.version>
        <elastic-job.version>1.0.6</elastic-job.version>
        <maven-compiler-plugin.version>3.3</maven-compiler-plugin.version>
        <maven-assembly-plugin.version>2.5.5</maven-assembly-plugin.version>
        <maven-resources-plugin.version>2.7</maven-resources-plugin.version>
        <maven-jar-plugin.version>2.6</maven-jar-plugin.version>
        <maven-surefire-plugin.version>2.18.1</maven-surefire-plugin.version>
@@ -68,6 +70,7 @@
        <taglist-maven-plugin.version>2.4</taglist-maven-plugin.version>
        <maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>
        <javadocExecutable>${java.home}/../bin/javadoc</javadocExecutable>
        
    </properties>
    
    <dependencyManagement>
@@ -255,6 +258,16 @@
                <version>${springframework.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>${gson.version}</version>
            </dependency>
            <dependency>
                <groupId>com.dangdang</groupId>
                <artifactId>elastic-job-core</artifactId>
                <version>${elastic-job.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
+2 −2
Original line number Diff line number Diff line
@@ -17,12 +17,12 @@
    </xsd:element>
    <xsd:element name="sharding-rule">
        <xsd:complexType>
            <xsd:all>
            <xsd:sequence>
                <xsd:element ref="table-rules" minOccurs="1" maxOccurs="1"/>
                <xsd:element ref="binding-table-rules" minOccurs="0" maxOccurs="1"/>
                <xsd:element ref="default-database-strategy" minOccurs="0" maxOccurs="1"/>
                <xsd:element ref="default-table-strategy" minOccurs="0" maxOccurs="1"/>
            </xsd:all>
            </xsd:sequence>
            <xsd:attribute name="data-sources" type="xsd:string" use="required" />
        </xsd:complexType>
    </xsd:element>
+48 −48
Original line number Diff line number Diff line
@@ -189,8 +189,8 @@ props: 属性配置(可选)

定义sharding-jdbc数据源

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     |  --------- | ------| -----   |
| *名称*                         | *类型*       | *数据类型*  |  *必填* | *说明*         |
| ----------------------------- | ------------ |  --------- | ------ | -------------- |
| id                            | 属性         |  String     |   是   | Spring Bean ID |
| sharding-rule                 | 标签         |   -         |   是   | 分片规则        |
| binding-table-rules`?`        | 标签         |   -         |   是   | 绑定表规则       |
@@ -200,50 +200,50 @@ props: 属性配置(可选)

### \<rdb:sharding-rule/>

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     | ---------  | ------| -----   |
| *名称*                         | *类型*       | *数据类型*  |  *必填* | *说明*                          |
| ----------------------------- | ------------ | ---------- | ------ | ------------------------------ |
| data-sources                  | 属性         | String      |   是   | 数据源Bean列表,多个Bean以逗号分隔 |
| table-rules                   | 标签         |   -         |   是   | 分片规则列表                     |

### \<rdb:table-rules/>

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     | ---------  | ------| -----   |
| *名称*                         | *类型*      | *数据类型*  |  *必填* | *说明*  |
| ----------------------------- | ----------- | ---------- | ------ | ------- |
| table-rule`+`                 | 标签         |   -         |   是  | 分片规则 |

### \<rdb:table-rule/>

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     |  --------- | ------| -----   |
| *名称*                         | *类型*       | *数据类型*  |  *必填* | *说明*  |
| --------------------          | ------------ | ---------- | ------ | ------- |
| logic-table                   | 属性         |  String     |   是   | 逻辑表名 |
  actual-tables                 | 属性         |  String     |   否  | 真实表名,多个表以逗号分隔,支持inline表达式,指定数据源需要加前缀,不加前缀为默认数据源 指定数据源需要加前缀,不加前缀为默认数据源。不填写表示使用动态表配置 |
| actual-tables                 | 属性         |  String     |   否   | 真实表名,多个表以逗号分隔,支持inline表达式,指定数据源需要加前缀,不加前缀为默认数据源 指定数据源需要加前缀,不加前缀为默认数据源。不填写表示使用动态表配置 |
| database-strategy             | 属性         |  String     |   否   | 分库策略,对应`<rdb:strategy>`中分库策略id, 如果不填需配置`<rdb:default-database-strategy/>` |
| table-strategy                | 属性         |  String     |   否   | 分表策略,对应`<rdb:strategy>`中分表策略id, 如果不填需配置`<rdb:default-table-strategy/>` |

### \<rdb:binding-table-rules/>

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     |  --------- | ------| -----   |
| *名称*                         | *类型*      | *数据类型*  |  *必填* | *说明*  |
| ----------------------------- | ----------- |  --------- | ------ | ------- |
| binding-table-rule            | 标签         |   -         |   是  | 绑定规则 |

### \<rdb:binding-table-rule/>

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     |  --------- | ------| -----   |
| *名称*                         | *类型*       | *数据类型*  |  *必填* | *说明*                   |
| ----------------------------- | ------------ | ---------- | ------ | ------------------------ |
| logic-tables                  | 属性         |  String     |   是   | 逻辑表名,多个表名以逗号分隔 |

### \<rdb:default-database-strategy/>

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     |  --------- | ------| -----   |
| *名称*                         | *类型*       | *数据类型*  |  *必填* | *说明*  |
| ----------------------------- | ------------ | ---------- | ------ | ------- |
| sharding-columns              | 属性         |  String     |   是  | 分片列名,多个列以逗号分隔 |
| algorithm-class               | 属性         |  Class      |   否  | 默认分库算法全类名,该类需使用默认的构造器或者提供无参数的构造器,与`algorithm-expression`有且仅有一个出现 |
| algorithm-expression          | 属性         |  String     |   否  | 默认分库算法表达式,与`algorithm-class`有且仅有一个出现 |

### \<rdb:default-table-strategy/\>

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     |  --------- | ------| -----   |
| *名称*                         | *类型*       | *数据类型*  |  *必填* | *说明*  |
| ----------------------------- | ------------ |  --------- | ------ | ------- |
| sharding-columns              | 属性         |  String     |   是   | 分片列名,多个列以逗号分隔 |
| algorithm-class               | 属性         |  Class      |   否   | 默认分表算法全类名,该类需使用默认的构造器或者提供无参数的构造器,与`algorithm-expression`有且仅有一个出现 |
| algorithm-expression          | 属性         |  String     |   否   | 默认分表算法表达式,与`algorithm-class`有且仅有一个出现 |
@@ -252,8 +252,8 @@ props: 属性配置(可选)

定义数据分库或分表策略

| *名称*                         | 类型         | *数据类型*  |  *必填*| *说明*  |
| --------------------          | --------     |  --------- | ------| -----   |
| *名称*                         | *类型*       | *数据类型*  |  *必填* | *说明*  |
| ----------------------------- | ------------ | ---------- | ------ | ------- |
| id                            | 属性         |  String     |   是   | Spring Bean ID |
| sharding-columns              | 属性         |  String     |   是   | 分片列名,多个列以逗号分隔 |
| algorithm-class               | 属性         |  Class      |   否   | 分库或分表算法全类名,该类需使用默认的构造器或者提供无参数的构造器,与`algorithm-expression`有且仅有一个出现 |
@@ -261,8 +261,8 @@ props: 属性配置(可选)

### \<rdb:props/\>

| *名称*                                | 类型         | *数据类型*  | *必填*| *说明*                              |
| ------------------------------------ | ------------ | ---------- | -----| ------------------------------------|
| *名称*                                | *类型*       | *数据类型*  | *必填* | *说明*                              |
| ------------------------------------ | ------------ | ---------- | ----- | ----------------------------------- |
| metrics.enable                       | 属性         |  boolean   |   否   | 是否开启度量采集,默认为false不开启     |
| metrics.millisecond.period           | 属性         |  String    |   否   | 度量输出周期,单位为毫秒               |
| metrics.logger.name                  | 属性         |  String    |   否   | 度量输出在日志中的标识名称             |
@@ -306,7 +306,7 @@ data_source_${id.longValue() % 2 + 1}
方法列表如下:

| *方法名*                  | *入参*         | *返回类型*      |
| ------------------------ | -------------- | ---------------|
| ------------------------ | -------------- | -------------- |
| longValue()              |                | long           |
| doubleValue()            |                | double         |
| dateValue(String format) | 时间格式化表达式 | java.util.Date |
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ weight = 1
### 新功能

1. [ISSUE #53](https://github.com/dangdangdotcom/sharding-jdbc/issues/53) 动态表配置
1. [ISSUE #58](https://github.com/dangdangdotcom/sharding-jdbc/issues/58) 柔性事务:最大努力送达型

### 结构调整

+108 −60
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ weight = 6
## 架构图
![最大努力送达型事务](../../img/architecture-soft-transaction-bed.png)

## 使用场景
## 用场景

* 根据主键删除数据。
* 更新记录永久状态,如更新通知送达状态。
@@ -24,76 +24,124 @@ weight = 6
* DELETE语句无要求。

## 开发指南
* `Sharding-JDBC-trnasaction`完全基于`java`开发,直接提供`jar`包,可直接使用maven导入坐标即可使用。
* 由于柔性事务采用异步尝试,需要部署独立的作业和`Zookeeper``Sharding-JDBC-trnasaction`采用`elastic-job`实现的`Sharding-JDBC-trnasaction-async-job`,通过简单配置即可启动高可用作业异步送达柔性事务。作业可自行打包,并通过`main`方法启动。(目前独立作业的配置部分还在开发中)
* 为了便于开发,`Sharding-JDBC-trnasaction`提供了内嵌异步作业,配置方法可参见事务管理器工厂配置项。
* 为了保证事务不丢失,`Sharding-JDBC-trnasaction`需要提供数据库存储事务日志,配置方法可参见事务管理器工厂配置项。
* 为了便于开发,`Sharding-JDBC-trnasaction`提供了基于内存的事务日志存储器,配置方法可参见事务管理器工厂配置项。

## 开发步骤
1. 配置`SoftTransactionConfiguration`
* `Sharding-JDBC-transaction`完全基于`java`开发,直接提供`jar`包,可直接使用maven导入坐标即可使用。
* 为了保证事务不丢失,`Sharding-JDBC-transaction`需要提供数据库存储事务日志,配置方法可参见事务管理器配置项。
* 由于柔性事务采用异步尝试,需要部署独立的作业和`Zookeeper``Sharding-JDBC-transaction`采用`elastic-job`实现的`Sharding-JDBC-transaction-async-job`,通过简单配置即可启动高可用作业异步送达柔性事务,启动脚本为`start.sh`
* 为了便于开发,`Sharding-JDBC-transaction`提供了基于内存的事务日志存储器和内嵌异步作业。

## 开发示例

```java
    // 1. 配置SoftTransactionConfiguration
    SoftTransactionConfiguration transactionConfig = new SoftTransactionConfiguration(dataSource);
    transactionConfig.setXXX();
```
2. 初始化`SoftTransactionManagerFactory`
```java
    SoftTransactionManagerFactory transactionManagerFactory = new SoftTransactionManagerFactory(transactionConfig);
    transactionManagerFactory.init();
```
    
3. 获取`BEDSoftTransactionManager`
```java
    BEDSoftTransactionManager transactionManager = (BEDSoftTransactionManager) transactionManagerFactory.getTransactionManager(SoftTransactionType.BestEffortsDelivery);
```
    // 2. 初始化SoftTransactionManager
    SoftTransactionManager transactionManager = new SoftTransactionManager(transactionConfig);
    transactionManager.init();
    
4. 开启事务
```java
    transactionManager.begin(connection);
```
    // 3. 获取BEDSoftTransaction
    BEDSoftTransaction transaction = (BEDSoftTransaction) transactionManager.getTransaction(SoftTransactionType.BestEffortsDelivery);
    
5. 执行`JDBC`
    // 4. 开启事务
    transaction.begin(connection);
    
6. 关闭事务
```java
    transactionManager.end();
    // 5. 执行JDBC
    /* 
        codes here
    */
    * 
    // 6.关闭事务
    transaction.end();
```

## 部署指南
* 部署用于存储事务日志的数据库。
* 部署用于异步作业使用的`Zookeeper`
* 按照正常`java`项目发布引用`Sharding-JDBC``jar`
* 打包并通过`main`方法启动`Sharding-JDBC-trnasaction-async-job`

## 事务管理器工厂配置项
## 事务管理器配置项

### `SoftTransactionConfiguration`配置
| 名称                                | 类型                                       | 默认值     | 功能                                                             |
| ---------------------------------- | ------------------------------------------ | --------- | ---------------------------------------------------------------- |
| syncMaxDeliveryTryTimes            | int                                        | 3         | 同步的事务送达的最大尝试次数                                         |
| asyncMaxDeliveryTryTimes           | int                                        | 3         | 异步的事务送达的最大尝试次数                                         |
| asyncMaxDeliveryTryDelayMillis     | long                                       | 60000     | 执行异步送达事务的延迟毫秒数。早于此间隔时间的入库事务才会被异步作业执行   |
| storageType                        | enum                                       | DATABASE  | 事务日志存储类型。可选值: DATABASE, MEMORY。使用DATABASE类型将自动建表 |
| transactionLogDataSource           | DataSource                                 | null      | 存储事务日志的数据源                                                |
| nestedJob                          | boolean                                    | false     | 是否使用内嵌的作业处理异步事务送达                                    |
| bestEffortsDeliveryJobConfiguration| AbstractBestEffortsDeliveryJobConfiguration| null      | 最大努力送达型异步作业配置对象                                       |
用于配置事务管理器。

### `BestEffortsDeliveryJobConfiguration`配置
用于配置异步送达作业。使用`elastic-job`实现的高可用弹性作业,可直接用于生产环境。如果`SoftTransactionConfiguration``nestedJob``false`,请使用此对象配置异步作业。

| 名称                                | 类型                        | 默认值     | 功能                                    |
| ---------------------------------- | --------------------------- | --------- | -------------------------------------- |
| zookeeperConnectionString          | String                      | null      | 注册中心的连接地址                        |
| *名称*                              | *类型*                                     | *必填* | *默认值*   | *说明*                                                                                       |
| ---------------------------------- | ------------------------------------------ | ------ | --------- | ------------------------------------------------------------------------------------------- |
| shardingDataSource                 | ShardingDataSource                         | `是`   |           | 事务管理器管理的数据源                                                                         |
| syncMaxDeliveryTryTimes            | int                                        | 否     | 3         | 同步的事务送达的最大尝试次数                                                                    |
| storageType                        | enum                                       | 否     | RDB       | 事务日志存储类型。可选值: RDB,MEMORY。使用RDB类型将自动建表                                       |
| transactionLogDataSource           | DataSource                                 | 否     | null      | 存储事务日志的数据源,如果storageType为RDB则必填                                                 |
| bestEffortsDeliveryJobConfiguration| NestedBestEffortsDeliveryJobConfiguration  | 否     | null      | 最大努力送达型内嵌异步作业配置对象。如需使用,请参考`NestedBestEffortsDeliveryJobConfiguration`配置 |

### `NestedBestEffortsDeliveryJobConfiguration`配置 (仅开发环境)
用于配置内嵌的异步作业,仅用于开发环境。生产环境应使用独立部署的作业版本。

### `NestedBestEffortsDeliveryJobConfiguration`配置
用于配置内嵌的异步作业,仅用于开发环境。生产环境应使用独立部署的作业版本。如果`SoftTransactionConfiguration``nestedJob``true`,请使用此对象配置异步作业。

| 名称                                | 类型                        | 默认值                    | 功能                                    |
| ---------------------------------- | --------------------------- | ------------------------ | -------------------------------------- |
| zookeeperPort                      | int                         | 4181                     | 内嵌的注册中心端口号                      |
| zookeeperDataDir                   | String                      | target/test_zk_data/nano/| 异步的事务送达的最大尝试次数               |
| *名称*                              | *类型*                       | *必填* | *默认值*                    | *说明*                                                         |
| ---------------------------------- | --------------------------- | ------ | ------------------------ | --------------------------------------------------------------- |
| zookeeperPort                      | int                         | 否     | 4181                     | 内嵌的注册中心端口号                                               |
| zookeeperDataDir                   | String                      | 否     | target/test_zk_data/nano/| 内嵌的注册中心的数据存放目录                                        |
| asyncMaxDeliveryTryTimes           | int                         | 否     | 3                        | 异步的事务送达的最大尝试次数                                        |
| asyncMaxDeliveryTryDelayMillis     | long                        | 否     | 60000                    | 执行异步送达事务的延迟毫秒数,早于此间隔时间的入库事务才会被异步作业执行  |

## 独立部署作业指南
* 部署用于存储事务日志的数据库。
* 部署用于异步作业使用的`Zookeeper`
* 配置`yaml`文件,参照示例。
* 下载并解压文件`sharding-jdbc-transaction-async-job-$VERSION.tar`,通过`start.sh`脚本启动异步作业。

## 异步作业yaml文件配置
```yaml
#目标数据库的数据源.
targetDataSource:
  ds_0: !!org.apache.commons.dbcp.BasicDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ds_0
    username: root
    password:
  ds_1: !!org.apache.commons.dbcp.BasicDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ds_1
    username: root
    password:

#事务日志的数据源.
transactionLogDataSource:
  ds_trans: !!org.apache.commons.dbcp.BasicDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/trans_log
    username: root
    password:

#注册中心配置
zkConfig:
  #注册中心的连接地址
  connectionString: localhost:2181
  
  #作业的命名空间
  namespace: Best-Efforts-Delivery-Job
  
  #注册中心的等待重试的间隔时间的初始值
  baseSleepTimeMilliseconds: 1000
  
  #注册中心的等待重试的间隔时间的最大值
  maxSleepTimeMilliseconds: 3000
  
  #注册中心的最大重试次数
  maxRetries: 3

#作业配置
jobConfig:
  #作业名称
  name: bestEffortsDeliveryJob
  
  #触发作业的cron表达式
  cron: 0/5 * * * * ?
  
  #每次作业获取的事务日志最大数量
  transactionLogFetchDataCount: 100
  
  #事务送达的最大尝试次数.
  maxDeliveryTryTimes: 3
  
  #执行送达事务的延迟毫秒数,早于此间隔时间的入库事务才会被作业执行
  maxDeliveryTryDelayMillis: 60000
```

# TCC型
开发中...
Loading