kettle-sqlser数据源转ob-mysql注意点

1、

SQL Server 的 JDBC 驱动返回列别名给 Kettle;但是 OceanBase MySQL 模式 的 JDBC 驱动,默认返回原始字段名,不返回 AS 别名。

例子:

image

 转为ob-mysql后,写sql用as别名,在流里字段找不到这个Supplier_ID_New 字段

方案:在连接数据源url添加

&useOldAliasMetadataBehavior=true

2、

问题:数据源是 ob-mysql,kettle 的更新控件是大表,会发生 oom,数据源是 sqlserver,大表就没事

原因:Kettle【更新 / 插入更新】控件的底层逻辑:会一次性把目标表的匹配主键全部读到 JVM 内存,用来做内存 hash 查找;SQL Server JDBC 驱动默认是流式游标(不会一次性全拉),而 OB-MySQL 模式的 OceanBase JDBC 驱动默认fetchSize=0,会把目标表全量一次性加载到 Kettle 堆内存,大表直接 OOM。

 

方案:【服务端游标】备选,更稳,避免长连接占用

在连接数据源url添加

useCursorFetch=true&useServerPrepStmts=true&defaultFetchSize=1000

  

  • useCursorFetch=true&useServerPrepStmts=true:服务端游标,每次拉 1000 行,不会长连接流式读;
  • defaultFetchSize=1000 按需调整(1000~5000);
  • 缺点:数据库侧开销更大,查询速度略慢。

 

posted @ 2026-09-30 17:13  一叶知秋。  阅读(9)  评论(0)    收藏  举报