我正在使用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);
我的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>
答案 0 :(得分:2)
DataFlow生成了太多连接,甚至达到了数据库限制(4000),即使我在连接池中指定了最大大小:1000
一个快速的猜测是,由于Dataflow可以有多个运行程序,因此每个运行程序可能都有自己的连接池。这意味着每个池将具有1000个独立的连接。这很可能是比实际使用的连接更多的方式-请参阅pool sizing上HikariCP的Wiki。
此外,在仪表板中,我可以看到比查询更多的连接:
由于设置了setInitialPoolSize(1000)
,所以池不会根据需要延迟建立连接,而是在初始化池时创建1000。从提供的示例中,您没有提供对连接寿命的任何限制,因此这些连接可能会持续尽可能长的时间。