如何从云运行的Java应用程序连接到云SQL数据库?

如何从云运行的Java应用程序连接到云SQL数据库?,java,google-cloud-platform,google-cloud-sql,vert.x,google-cloud-run,Java,Google Cloud Platform,Google Cloud Sql,Vert.x,Google Cloud Run,我有一个Java/Vert.x应用程序部署为云运行容器。它运转良好。我试图访问我的云SQL MySQL实例,但没有用。只要我尝试连接到DB实例并创建数据源,我的应用程序就会挂起 我的云运行容器与具有云SQL客户端角色的服务帐户相关联 我在这里遵循了规范的GCP教程: 很明显,我在具体细节上交换了意见。以下是违规代码: private static final String PW = "mypassword"; private static final String CONN_NA

我有一个Java/Vert.x应用程序部署为云运行容器。它运转良好。我试图访问我的云SQL MySQL实例,但没有用。只要我尝试连接到DB实例并创建数据源,我的应用程序就会挂起

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

我在这里遵循了规范的GCP教程: 很明显,我在具体细节上交换了意见。以下是违规代码:

    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");
    }
我的日志在“mysqlrepoinit2”处停止(除此之外,我还收到Vertx警告,我的主线程被阻塞)


关于我可能遗漏的内容有什么想法吗?

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

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

我们的数据库是否有公共IP?错误日志是什么?根据我的Cloud SQL Overview dashboard,它既有一个公共IP地址,当然还有一个实例连接名称(我正试图使用这个名称进行连接)。到目前为止,我没有看到任何相关的错误日志。我们的数据库是否有公共IP?错误日志是什么?根据我的Cloud SQL Overview dashboard,它既有一个公共IP地址,当然还有一个实例连接名称(我正试图使用这个名称进行连接)。到目前为止,我没有看到任何相关的错误日志。