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

时间:2019-05-05 14:00:00

标签: mysql google-cloud-platform google-cloud-dataflow google-cloud-sql apache-beam

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

好像DataFlow生成了太多连接,甚至达到了数据库限制(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);

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

enter image description here

enter image description here

我的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>

1 个答案:

答案 0 :(得分:2)

  

DataFlow生成了太多连接,甚至达到了数据库限制(4000),即使我在连接池中指定了最大大小:1000

一个快速的猜测是,由于Dataflow可以有多个运行程序,因此每个运行程序可能都有自己的连接池。这意味着每个池将具有1000个独立的连接。这很可能是比实际使用的连接更多的方式-请参阅pool sizing上HikariCP的Wiki。

  

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

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