# BinDatax
**Repository Path**: taher_chan/BinDatax
## Basic Information
- **Project Name**: BinDatax
- **Description**: 开放简单数据入库程序、可自由装配相关功能。
- **Primary Language**: Java
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2024-08-22
- **Last Updated**: 2025-08-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: ETL, 高性能, 自研, 长期维护, SPI
## README
# BinDatax(自由拓展式数据入库程序)
### 一、软件介绍
BinDatax核心功能是从源库抽取数据到目标库。
### 二、功能介绍
#### 0、支持的数据库类型
目前仅适配Oracle
#### 1、核心功能
1.1、支持多条SQL语句并行查询。
1.2、支持把SQL结果集分成多个数据片,同时多线程并行入库。
1.3、支持每个数据片按批次入库。
1.4、支持入库超时控制。
1.5、支持按批次入库发生错误以后,自动把当前错误批次数据转为按行入库。(可设置)
1.6、支持是否统计目标表总数。
1.7、支持批次入库失败后进行重试,支持设置重试次数和时间间隔。
1.8、支持使用数据库连接池。
更多功能请查看配置:[测试配置](https://gitee.com/taher_chan/BinDatax/tree/master/BinDatax-biz/BinDatax-biz-etl/src/main/resources/config)
#### 2、可开放式扩展功能
##### 2.1、支持开放式装配使用日志系统模块。
目前已实现的日志系统模块为(通过SPI方式):
2.1.1、空日志系统(不输出执行日志,默认)
2.1.2、console日志系统(输出到控制台)
2.1.3、log4j日志系统(Java日志门面)
2.1.4、pentaho日志系统(kettle数据清洗软件)
##### 2.2、支持开放式装配监控事件模块。
2.2.1、可通过实现监控事件SPI jar包的方式,自主实现拓展监控事件功能。
### 三、性能测试
#### 测试结果
仅供相对性参考,最终取决于目标库性能
测试配置:查询10万数据入库,按5000条为一个批次提交。
一、有主键情况:
1、单线程按序入库:耗时34秒。
2、分5个数据片同时入库:耗时19秒
二、无主键情况:
1、单线程按序入库:耗时17秒。
2、分5个数据片同时入库,耗时10秒
#### 测试图示
#### 测试情况1

#### 测试情况2

#### 测试情况3

#### 测试情况4

### 四、自定义插拔式功能拓展(通过SPI方式自由拓展)
#### 4.1、怎么自定义日志系统功能
日志保存需求假设:需要把执行日志保存到kafka消息队列中。
第一步:在 BinDatax-spi模块中,新建一个以“BinDatax-spi-log-”为前缀的子模块,比如 [BinDatax-spi-log-log4j模块](https://gitee.com/taher_chan/BinDatax/tree/master/BinDatax-spi/BinDatax-spi-log-log4j)
第二步:实现LogOutInterface接口。比如 [BinDataxLogerLog4j](https://gitee.com/taher_chan/BinDatax/blob/master/BinDatax-spi/BinDatax-spi-log-log4j/src/main/java/com/bindatax/spi/log/log4j/BinDataxLogerLog4j.java)
第三步:在resource目录新建SPI文件,特别注意,“resources/META-INF/services”三个层级目录必须存在。然后新建一个以接口类路径为名的文本文件,里面加入实现的子类路径。比如:[日志SPI文件](https://gitee.com/taher_chan/BinDatax/blob/master/BinDatax-spi/BinDatax-spi-log-log4j/src/main/resources/META-INF/services/com.bindatax.core.log.LogOutInterface)
第四步:完成以上步骤以后,maven install这个子项目工程。
第五步:把生成的日志模块jar包放进打包生成的程序的lib文件夹下,或类似于这样,把这个项目工程坐标引入:[测试工程模块pom.xml](https://gitee.com/taher_chan/BinDatax/blob/master/BinDatax-biz/BinDatax-biz-etl/pom.xml)
第六步:在配置文件启用什么日志系统。(trans.log.system.type键):[测试工厂模块配置文件](https://gitee.com/taher_chan/BinDatax/blob/master/BinDatax-biz/BinDatax-biz-etl/src/main/resources/config/bindatax-config.properties)
第七步:以上步骤结束以后,即可无需修改核心程序,把执行日志保存到kafka里面。
#### 4.2、自定义监控事件功能
在程序执行的过程中,我们往往需要加入各种辅助功能,比如入库数据统计。
自定义监控事件功能的实现逻辑和4.1的日志系统功能差不多。
这是实现的自定义统计功能模块,可自由装配和卸载。[自定义程序统计逻辑模块示例](https://gitee.com/taher_chan/BinDatax/blob/master/BinDatax-spi/BinDatax-spi-event-statistics-saveLog/src/main/java/com/bindatax/event/impl/statistics/dblog/EventModuleStatisticsSaveLog.java)
可自定义实现的监控类型事件有:
TASK_INIT_BEFORE:任务初始化之前
TASK_INIT_AFTER:任务初始化之后
TASK_RUNNING_CREATE_CONN_BEFORE:任务执行中(构建连接池之前)
ASK_RUNNING_CREATE_CONN_AFTER:任务执行中(构建连接池之后)
TASK_RUNNING_SOURCE_QUERY_BEFORE:任务执行中(查询结果之前)
TASK_RUNNING_SOURCE_QUERY_AFTER:任务执行中(查询结果之后)
TASK_RUNNING_TARGET_META_BEFORE:任务执行中(获取目标表元数据之前)
TASK_RUNNING_TARGET_META_AFTER:任务执行中(获取目标表元数据之后)
TASK_RUNNING_MAPPING_COLUMN_BEFORE:任务执行中(映射查询结果集与目标表字段之前)
TASK_RUNNING_MAPPING_COLUMN_AFTER:任务执行中(映射查询结果集与目标表字段之后)
TASK_RUNNING_WRITE_DB_BEFORE:任务执行中(任务准备执行数据入库之前)
TASK_RUNNING_WRITE_BATCH_BEFORE:任务执行中(执行每个批次入库之前)
TASK_RUNNING_WRITE_BATCH_AFTER_SUCCESS:任务执行中(执行每个批次入库成功之后)
TASK_RUNNING_WRITE_BATCH_AFTER_FAIL:任务执行中(执行每个批次入库失败之后)
TASK_RUNNING_SEGMENT_BEFORE:任务执行中(每个数据片开始入库数据之前)
TASK_RUNNING_SEGMENT_NOTIFY_ERROR_STOP:任务执行中(每个数据片接收到任务组通知【停止数据入库】,退出循环获取公共数据池数据时)
TASK_RUNNING_SEGMENT_AFTER_SUCCESS:任务执行中(每个数据片结束入库数据之后-成功)
TASK_RUNNING_SEGMENT_AFTER_FAIL:任务执行中(每个数据片结束入库数据之后-失败)
TASK_RUNNING_WRITE_BETWEEN_BATCH_FAIL_AND_ROW_BEFORE:任务执行中(在执行每个批次入库失败之后,转为按行入库之前)
TASK_RUNNING_WRITE_ROW_AFTER_SUCCESS:任务执行中(按行入库成功之后)
TASK_RUNNING_WRITE_ROW_AFTER_FAIL:任务执行中(按行入库失败之后)
TASK_FINISH:任务完成
TASK_FINISH_SUCCESS:任务完成(成功)
TASK_FINISH_FAIL:任务完成(失败)
TASK_DESTROYED:任务销毁时
更多请查看[监控事件类型](https://gitee.com/taher_chan/BinDatax/blob/master/BinDatax-core/src/main/java/com/bindatax/core/task/event/EventType.java)