Как я могу подключиться из приложения Cloud Run Java к базе данных Cloud SQL? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть приложение Java / Vert.x, развернутое как контейнер Cloud Run. Работает нормально. Я пытался получить доступ к своему экземпляру Cloud SQL MySQL, но безрезультатно. Мое приложение зависает, как только я пытаюсь подключиться к экземпляру БД, создавая источник данных.

Мой контейнер Cloud Run связан с учетной записью службы с ролью Cloud SQL Client .

Я следовал учебному пособию по каноническому 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 предупреждения о том, что мой основной поток заблокирован).

Любые мысли о что мне может не хватать?

1 Ответ

0 голосов
/ 30 марта 2020

Проблема, похоже, связана с вызовом этого кода из статьи Vert.x. Когда я вызвал его непосредственно из основного метода приложения, я смог получить полезные сообщения журнала, которые жаловались на часть "/ cloudsql /" имени соединения. Это предоставило достаточно информации, чтобы в конечном итоге решить эту проблему.

...