【问题标题】:How can I connect from Cloud Run Java application to a Cloud SQL database?如何从 Cloud Run Java 应用程序连接到 Cloud SQL 数据库?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 2020-08-31
    • 2021-02-12
    • 2019-09-05
    • 2020-06-15
    • 2019-10-28
    • 2018-01-11
    • 2021-08-07
    • 2020-02-23
    相关资源
    最近更新 更多