【发布时间】:2021-09-09 12:56:35
【问题描述】:
我正在尝试从 Apache Beam Java 代码连接到托管在 GCP 云上的 SQL Server 实例。光束管道从源表读取到目标表。源表托管在 SQL Server 中,而目标表托管在 MySQL 服务器中。该管道将由 Google Cloud Dataflow 执行。 类似于here的问题,但我需要基于Java SDK的SQL Server。
为了连接到云实例,我偶然发现了Cloud SQL Socket Library,它允许具有适当权限的用户连接到 Cloud SQL 数据库。但是,它似乎只适用于 MySQL 和 Postgres。
我编写了以下代码来连接 MySQL 实例,它可以工作。
private static JdbcIO.DataSourceConfiguration getMySQLDataSourceConfiguration() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
String password = System.getenv("MYSQL_USER_PASSWORD");
String userName = System.getenv("MYSQL_USER_NAME");
String databaseName = System.getenv("MYSQL_DATABASE_NAME");
String instanceConnectionName = System.getenv("MYSQL_INSTANCE_CONNECTION_NAME");
String dbUrl = String.format("jdbc:mysql://google/%s?cloudSqlInstance=%s" +
"&socketFactory=com.google.cloud.sql.mysql.SocketFactory&useSSL=false" +
"&user=%s&password=%s&rewriteBatchedStatements=true", databaseName, instanceConnectionName, userName, password);
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl(dbUrl);
dataSource.setMaxPoolSize(10);
dataSource.setInitialPoolSize(6);
return JdbcIO.DataSourceConfiguration.create(dataSource);
}
对于 MySQL,我知道连接字符串的结构,但是,我无法为 SQL Server 找到类似的结构。
如何从 Apache Beam 代码连接到 SQL Server 类型的实例?
【问题讨论】:
-
您考虑过使用 Beam 的 JDBCIO 连接器吗? github.com/apache/beam/blob/master/sdks/java/io/jdbc/src/main/… 它提供了标准化的 API,因此可能更易于配置/使用。
-
我正在使用 JDBCIO 连接器进行连接。只是我希望连接字符串从连接器直接连接到云实例。
-
似乎您的问题更多是关于为 SQL Server 实例创建“javax.sql.DataSource”。这有帮助吗? stackoverflow.com/questions/1080354/…
-
没有。数据流需要连接到云实例。它必须通过 SocketFactory。我实际上可以使用 DirectRunner 在本地连接到 SQL Server,问题出在 DataflowRunner。
-
你能澄清一下吗? JDBCIO.Read 是一个 Beam 转换,因此它连接到数据库的方式对于所有跑步者来说应该是相同的。您只需确保运行程序(Dataflow)启动的 VM 可以访问数据库。
标签: sql-server google-cloud-dataflow apache-beam