【问题标题】:Querying a relational database through Google DataFlow Transformer通过 Google DataFlow Transformer 查询关系数据库
【发布时间】:2025-11-22 15:55:01
【问题描述】:

我想在我的数据流管道上实现一个ParDo Transformer,它基本上根据每个要处理的元素提供的数据来查询一个关系数据库。我知道用户定义的转换器中的每个属性都必须是可序列化的,但是要使用jdbc 向数据库查询数据,我需要创建一个自然是不可序列化对象的Connection

在数据流管道上下文中仍然可以这样做吗?

【问题讨论】:

  • 请参阅*.com/help/how-to-ask。如果有人回答“是”而其他人回答“否”,你会接受哪一个?

标签: java mysql google-cloud-dataflow


【解决方案1】:

是的,这是可能的。您可以使您的 Connection 对象瞬态,使其不序列化,并通过 startBundle 方法为每个捆绑创建一次。处理完包中的所有元素后,可以通过finishBundle 方法关闭连接。

class MyDoFn extends DoFn<X, Y> {
  private transient Connection jdbc;

  @Setup
  public void setup(Context c) {
    jdbc = // Create connection
  }

  @ProcessElement
  public void processElement(ProcessContext c) {
    // query database
  }

  @Teardown
  public void tearDown(Context c) {
    // close connection
  }
}

【讨论】:

    【解决方案2】:

    另请参阅最近在Apache Beam (incubating) 中添加的JDBC connector

    【讨论】:

    • 在这个问题的上下文中使用 JDBC 连接器是不可能的,因为使用它作为源是为了读取数据流,因此允许在初始化期间提供查询。这并不意味着,因此不允许基于来自另一个流的传入元素进行查询。