Skip to content

Kettle 使用 File Repository 时数据库连接共享的问题

🏷️ Kettle

由于使用 数据库仓库(Database Repository)开发时没法实现版本的管理,所以开发时使用了 文件仓库(File Repository)。

在发布运行时遇到了一个问题:数据库连接是存储在各个转换或作业里的,变更环境时需要修改所有的 作业(job)和 转换(transformation) 。
下面是当时使用的 kitchen 命令。

bash
Kitchen.bat /norep /file "C:\Users\liujiajia\Documents\oct_b2b_kettle\repository\BT\MainJob_Sync_BusOrder.kjb"

使用的是 norepfile 参数,不登录仓库,直接调用指定的 job。这种方式有两个问题:

  1. 如果这个 job 调用了外层目录的 job 或 transformation,会报 FileNotFoundException 异常;
  2. 若要变更数据库连接,需要修改所有的 job 和 transformation;

为了解决这两个问题,只能以登录到仓库的方式运行 job。有两种解决方案:

  1. 登录到文件模式的仓库,然后使用 job 参数指定需要运行的作业。

    使用 rep 参数指定需要登录的仓库,然后使用 job 参数指定需要运行的作业。
    登录到仓库后,job 就可以正常的调用外层目录的 job 或 transformation 了。

    文件仓库的数据库连接有单独的文件,默认是存储在仓库根目录下,后缀为 .kdb
    若要变更 DB 连接 只需要修改对应的数据库连接文件即可。
    此时虽然每个 job 或 transformation 中仍然有旧的 DB 连接 设置,但是会优先使用 .kdb 文件中的设置。

    bash
    Kitchen.bat -rep FileRepositoryName -job "/BT/MainJob_Sync_BusOrder"

    也可以使用 dir 参数来指定 job 的目录。

    bash
    Kitchen.bat -rep FileRepositoryName -dir "/BT" -job "MainJob_Sync_BusOrder"
  2. 将整个资源库导出,然后导入到一个数据库仓库,然后再运行。

    同文件仓库一样,登录到仓库后 job 就可以正常的调用外层目录的 job 或 transformation 了。

    数据库仓库中的 DB 连接 默认就是共享的,每个 job 或 transformation 中不会单独保存 DB 连接 的设置。

    调用方式如下:

    bash
    Kitchen.bat -rep DataBaseRepositoryName -user username -pass password -dir "/BT" -job "MainJob_Sync_BusOrder"