Средство запуска ApacheBeam / DataFlow со средством записи JdbcIO создает слишком много соединений - PullRequest
2 голосов
/ 05 мая 2019

Я использую облачный SQL GCP с экземпляром 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

my 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 Ответ

2 голосов
/ 06 мая 2019

DataFlow генерирует слишком много соединений и достигает предела БД (4000), даже если я укажу в пуле соединений, максимальный размер: 1000

Можно предположить, что сПоток данных может иметь несколько участников, каждый из которых, вероятно, имеет собственный пул соединений.Это означает, что каждый пул будет иметь 1000 отдельных соединений.Скорее всего, это гораздо больше соединений, чем вы должны использовать на самом деле - см. Вики HikariCP по размер пула .

Кроме того, на панели инструментов я вижу гораздо больше соединений, чем запросов:

Поскольку вы установили setInitialPoolSize(1000), пул не устанавливает соединения по мере необходимости, ивместо этого он создает 1000 при инициализации пула.Из предоставленного примера вы не указали никаких ограничений на продолжительность жизни соединения, поэтому эти соединения, вероятно, будут сохраняться как можно дольше.

...