从本地计算机在GCP上连接MYSQL第二代

时间:2018-06-22 11:08:12

标签: java mysql google-app-engine google-cloud-platform

我正在尝试为某些REST API构建Spring Boot应用程序。作为其一部分,我决定使用GCP CLOUD SQL(MYSQL服务)。所有这些都已配置并设置,并按照控制台上提到的说明进行操作

现在,我正在尝试使用小型JDBC Client从我的计算机连接到Cloud DB。 库,我正在使用的是用于jdbc连接的Google SDK包装器的一部分。

 compile 'com.google.cloud.sql:mysql-socket-factory:1.0.9'

我已经配置了服务帐户并以JSOn格式创建了密钥文件。 设置GOOGLE_APPLICATION_CREDENTIALS = D:\ ServiceAccountKeyGCP \ streaming.json。

完成所有这些操作后,我仍然遇到错误

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.Util.getInstance(Util.java:387)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:917)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2332)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2085)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at TestCloudConnection.main(TestCloudConnection.java:15)
Caused by: java.lang.RuntimeException: Unable to obtain credentials to communicate with the Cloud SQL API
    at com.google.cloud.sql.core.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:556)
    at com.google.cloud.sql.core.SslSocketFactory.getInstance(SslSocketFactory.java:143)
    at com.google.cloud.sql.mysql.SocketFactory.connect(SocketFactory.java:56)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:298)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2286)
    ... 13 more
Caused by: java.io.IOException: The Application Default Credentials are not available. They are available if running on Google App Engine, Google Compute Engine, or Google Cloud Shell. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
    at com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredential(DefaultCredentialProvider.java:98)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:213)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:191)
    at com.google.cloud.sql.core.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:554)
    ... 18 more

示例代码:

//System.out.println(GoogleCredential.getApplicationDefault().getServiceAccountPrivateKey().getAlgorithm());

            //GoogleCredential credential=GoogleCredential.fromStream(new FileInputStream(new File("D:\\ServiceAccountKeyGCP\\streaming-208006-393bbeb34baf.json")));
            //System.out.println(credential.getServiceAccountId());
            Connection connection=DriverManager.getConnection("jdbc:mysql://google/streaming?cloudSqlInstance=streaming-208006:asia-southeast1:streamingdev&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=root&password=streamingdev&useSSL=false");
    System.out.println(connection.getCatalog());

0 个答案:

没有答案