如何从Cloud Run Java应用程序连接到Cloud SQL数据库



我有一个Java/Vert.x应用程序部署为Cloud Run容器。运行良好。我曾尝试访问我的云SQL MySQL实例,但没有成功。当我尝试连接到DB实例并创建DataSource时,我的应用程序就会挂起。

我的云运行容器与云SQL客户端角色的服务帐户相关联。

我在这里遵循了规范的GCP教程:https://cloud.google.com/sql/docs/mysql/connect-run显然是在交换我的细节。以下是违规代码:

private static final String PW = "mypassword";
private static final String CONN_NAME = "/cloudsql/mydatabase-111222:us-west1:my-project";
private DataSource pool;
@Override
public void init() throws Exception {
LOGGER.info("MysqlRepo-init starting...");
// The configuration object specifies behaviors for the connection pool.
HikariConfig config = new HikariConfig();
LOGGER.info("MysqlRepo-init 1");
// Configure which instance and what database user to connect with.
config.setJdbcUrl(String.format("jdbc:mysql:///%s", "mydb"));
config.setUsername("root"); // e.g. "root", "postgres"
config.setPassword(PW); // e.g. "my-password"
// For Java users, the Cloud SQL JDBC Socket Factory can provide authenticated connections.
// See https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory for details.
config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory");
config.addDataSourceProperty("cloudSqlInstance", CONN_NAME);
config.addDataSourceProperty("useSSL", "false");
LOGGER.info("MysqlRepo-init 2");
// Initialize the connection pool using the configuration object.
pool = new HikariDataSource(config);
LOGGER.info("MysqlRepo-init 3");
ResultSet rs = pool.getConnection().createStatement().executeQuery("SELECT COUNT(*) col FROM dual WHERE 1=1");
LOGGER.info("MysqlRepo-init Results = " + rs.getFetchSize());
LOGGER.info("...MysqlRepo-init done");
}

我的日志在"MysqlRepo-init2"处停止(除此之外,我收到了Vertx警告,说我的主线程被阻止了(。

有没有想过我可能错过了什么?

问题似乎与从Vert.x vertical调用此代码有关。当我直接从应用程序的主方法调用它时,我能够获得有用的日志消息,这些消息抱怨连接名称的"/cloudsql/"部分。这为最终解决这个问题提供了足够的信息。

相关内容

  • 没有找到相关文章

最新更新