ApacheBeam/DataFlow 带有 JdbcIO 编写器的运行器创建了太多连接

ApacheBeam/DataFlow runner with JdbcIO writer creates too many connections

我正在使用 GCP 云 SQL,使用 MySQL 实例并使用 JdbcIo 将数据从 DataFlow 管道写入 MySQL。

DataFlow 似乎生成了太多连接,并达到了 DB 限制 (4000),即使我在连接池中指定了最大大小:1000

 ComboPooledDataSource dataSource = new ComboPooledDataSource();
 try {
       dataSource.setDriverClass("org.mysql.Driver");
     } catch (PropertyVetoException e) {
            throw new RuntimeException("Failed set mysql driver",e);
     }
       dataSource.setJdbcUrl("jdbc:mysql://google/live-data?cloudSqlInstance<INSTANCE_NAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&useSSL=false&user=<USER>&password=<PASSWORD>");

       dataSource.setMaxPoolSize(1000);
       dataSource.setInitialPoolSize(1000);

此外,在仪表板中我可以看到比查询更多的连接:

我的pom.xml

 <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.4</version>
        </dependency>
        <dependency>
            <groupId>com.google.cloud.sql</groupId>
            <artifactId>mysql-socket-factory</artifactId>
            <version>1.0.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-sdks-java-io-jdbc</artifactId>
            <version>${beam.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

DataFlow generates too many connections, and reach the DB limit (4000), even that I specify in the connection pool, max size: 1000

一个快速的猜测是,由于 Dataflow 可以有多个运行器,每个运行器可能都有自己的连接池。这意味着每个池将有 1000 个独立的连接。这很可能比您实际使用的连接要多 - 请参阅 pool sizing 上的 HikariCP 维基。

Also, in the dashboard I can see much more connections then queries:

由于您设置了 setInitialPoolSize(1000),池不会根据需要延迟建立连接,而是在池初始化时创建 1000 个连接。从提供的示例中,您没有对连接寿命提供任何限制,因此这些连接可能会尽可能长地持续存在。