【发布时间】:2020-07-08 19:39:20
【问题描述】:
我有一个 Java/Vert.x 应用程序部署为 Cloud Run 容器。它运行良好。我试图访问我的 Cloud SQL MySQL 实例,但无济于事。一旦我尝试连接到数据库实例创建数据源,我的应用程序就会挂起。
我的 Cloud Run 容器与具有 Cloud 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-init 2”(除此之外,我收到 Vertx 警告说我的主线程被阻止)。
对我可能遗漏的东西有什么想法吗?
【问题讨论】:
-
我们的数据库有公网IP吗?错误日志是什么?
-
根据我的 Cloud SQL 概览仪表板,它有一个公共 IP 地址和(当然)一个实例连接名称(这是我试图用来连接的名称)。到目前为止,我没有看到任何相关的错误日志。
标签: java google-cloud-platform google-cloud-sql vert.x google-cloud-run