本篇是第 5 章第 1 节,承接作业变量,专门讲数据库连接的生命周期与统一管理。
Kettle 的数据库连接是一个可复用对象,定义一次后,多个转换的步骤都能引用它。我们把它集中维护,禁止在单个步骤里硬写连接串,否则换库时要改 N 处。集中是连接管理的第一原则。
连接参数里最易错的是「字符集」和「驱动版本」。中文环境务必显式设 UTF-8 或 GBK 与源一致;驱动 jar 要和目标库大版本匹配。我们固定驱动目录,禁止随意升级,避免类型映射悄悄变化。
密码管理要用变量。我们在连接里填 ${DB_PASS},真值在服务器 kettle.properties 或调度系统的密文里。曾经有同事把密码写进连接、连接又进了 Git,泄露后全员改密,教训深刻。
连接还有「连接池」选项:复用物理连接、减少握手开销。我们对高频小查询开池,对低频大装载关池(避免占用连接数)。池大小按并发转换数估,过大反而拖垮源库,这是和性能章节联动的点。
多环境切换靠变量前缀:测试连 {TEST_DB_HOST}、生产连 {PROD_DB_HOST},同一份 .ktr 在两地跑。我们靠作业注入不同变量文件实现,设计文件零改动。
下面这段 xml 给出了可直接落地的配置,输入来自上一步、输出写入目标端:
<connection> <name>src_mysql</name> <type>MySQL</type> <host>${DB_HOST}</host><port>${DB_PORT}</port> <database>${DB_NAME}</database> <username>${DB_USER}</username><password>${DB_PASS}</password> <attributes><attribute><code>characterEncoding</code><attribute>UTF-8</attribute></attributes> </connection>
连接对象用变量承载敏感信息,编码显式声明。我们在所有连接模板里固化这段,杜绝硬编码。
# 5.1 数据库连接管理 DB_HOST=10.0.1.10 # prod.properties DB_HOST=10.0.3.21 # 启动时选择 kitchen.sh /file:job.kjb -param:ENV=prod
环境差异外置,连接模板稳定。我们规定连接只存结构、不存环境值,值全靠变量注入。
一次例行升级把 MySQL 驱动从 5.x 换到 8.x,某字段的 DATE 被映射成带时分秒,下游按纯日期比对全部失配。
回退驱动并固定版本,在连接里显式声明 serverTimezone 与编码。
<connection><name>src_mysql</name> <attributes> <attribute><code>serverTimezone</code><attribute>Asia/Shanghai</attribute></attribute> </attributes> </connection>
类型映射恢复,比对正常,且驱动被锁版本不再漂移。
根因是连接层的不变量被改动。连接不是配一次就忘,驱动与编码是契约,必须版本锁定、显式声明。
更稳是把驱动连同 Kettle 一起容器化,环境与版本一体交付,避免宿主机各自为政。
误区:密码写死在连接。必须用变量,密文由配置中心下发。
误区:驱动随意升级。连接层契约要锁版本,升级前先测类型映射。
取舍:高频查询开连接池,大装载关池;按并发与环境定。

数据库连接是 ETL 的地基。配置时 JDBC 驱动版本必须与数据库服务端匹配,否则稀奇古怪的协议错误会在生产才出现。字符集要显式指定(如 useUnicode=true&characterEncoding=UTF-8),避免中文乱码。连接池参数(最大连接数、空闲回收)决定并发上限,过小排队、过大压垮库。生产环境密码必须用变量 ${p_db_pwd} 注入,禁止明文。共享连接集中放在连接库,多个转换复用,改一次生效全局。
# 数据库连接(JDBC)关键参数(输入:连接名引用;输出:可复用的数据源) jdbc:mysql://dw.prod:3306/orders?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # 连接池: 最大 20 / 空闲超时 300s
.ktr 进代码库泄露。| 配置项 | 易错点 | 正确做法 |
|---|---|---|
| 驱动 | 版本错配 | 对齐服务端 |
| 字符集 | 默认依赖环境 | 显式 UTF-8 |
| 凭据 | 明文写死 | 变量注入 |
开发库正常,生产库中文读到一半变问号。
连接显式指定 UTF-8 与 serverTimezone,密码走变量。
jdbc:mysql://dw.prod:3306/orders?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # username=${p_db_user} password=${p_db_pwd} 不写死
中文乱码消失,连接稳定跨环境复用。
字符集/驱动/凭据三件套是连接问题七成根因。
连接池设最大连接与空闲回收,防并发打爆库。
| 项 | 易错 | 正确 |
|---|---|---|
| 驱动 | 版本错配 | 对齐服务端 |
| 字符集 | 环境默认 | UTF-8 |
| 凭据 | 明文 | 变量注入 |