5.1 数据库连接管理


5.1 数据库连接管理

连接不是填一次密码就完事

本篇是第 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 一起容器化,环境与版本一体交付,避免宿主机各自为政。

常见误区与工程取舍

误区:密码写死在连接。必须用变量,密文由配置中心下发。

误区:驱动随意升级。连接层契约要锁版本,升级前先测类型映射。

取舍:高频查询开连接池,大装载关池;按并发与环境定。

05-01-fig01

深入:数据库连接的稳定之道

数据库连接是 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
凭据 明文 变量注入

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U