我正在尝试为某些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());