Java 无法获取与云SQL API通信的凭据,远程主机在握手期间关闭了连接
我正在尝试使用下面的代码连接到谷歌云上的mysql。这是我第一次尝试使用mysql处理google云sqlJava 无法获取与云SQL API通信的凭据,远程主机在握手期间关闭了连接,java,google-cloud-datastore,Java,Google Cloud Datastore,我正在尝试使用下面的代码连接到谷歌云上的mysql。这是我第一次尝试使用mysql处理google云sql public static void main(String[] args) throws IOException, SQLException { String instanceConnectionName = "####";//providing correct connection name String databaseName = "shan"; String usernam
public static void main(String[] args) throws IOException, SQLException {
String instanceConnectionName = "####";//providing correct connection name
String databaseName = "shan";
String username = "root";
String password = "####";//providing correct password
String jdbcUrl = String.format(
"jdbc:mysql://google/%s?cloudSqlInstance=%s&"
+ "socketFactory=com.google.cloud.sql.mysql.SocketFactory",
databaseName,
instanceConnectionName);
Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
try (Statement statement = connection.createStatement()) {
ResultSet resultSet = statement.executeQuery("SHOW TABLES");
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
}
}
当我尝试执行此代码时,出现以下错误:
Feb 25, 2018 4:45:41 PM com.google.cloud.sql.mysql.SocketFactory connect
INFO: Connecting to Cloud SQL instance [stockinventary-1517746804001:asia-east1:shan].
Feb 25, 2018 4:45:41 PM com.google.cloud.sql.core.SslSocketFactory getInstance
INFO: First Cloud SQL connection, generating RSA key pair.
Exception in thread "main" 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:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2271)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2024)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
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:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.sf.si.poc.ListTables.main(ListTables.java:48)
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:549)
at com.google.cloud.sql.core.SslSocketFactory.getInstance(SslSocketFactory.java:140)
at com.google.cloud.sql.mysql.SocketFactory.connect(SocketFactory.java:48)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2192)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2225)
... 13 more
Caused by: java.io.IOException: Error reading credential file from location C:\Users\dell\AppData\Roaming\gcloud\application_default_credentials.json: Remote host closed connection during handshake
at com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getCredentialUsingWellKnownFile(DefaultCredentialProvider.java:251)
at com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredentialUnsynchronized(DefaultCredentialProvider.java:117)
at com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredential(DefaultCredentialProvider.java:91)
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:547)
... 18 more
2018年2月25日下午4:45:41 com.google.cloud.sql.mysql.SocketFactory connect
信息:连接到云SQL实例[StockInventory-1517746804001:asia-east1:shan]。
2018年2月25日下午4:45:41 com.google.cloud.sql.core.SslSocketFactory getInstance
信息:第一个云SQL连接,生成RSA密钥对。
线程“main”com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException中出现异常:无法创建到数据库服务器的连接。
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:425)
位于com.mysql.jdbc.Util.getInstance(Util.java:408)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
位于com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2271)
位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2024)
位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:779)
位于com.mysql.jdbc.JDBC4Connection(JDBC4Connection.java:47)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:425)
位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
位于java.sql.DriverManager.getConnection(未知源)
位于java.sql.DriverManager.getConnection(未知源)
位于com.sf.si.poc.ListTables.main(ListTables.java:48)
原因:java.lang.RuntimeException:无法获取与云SQL API通信的凭据
位于com.google.cloud.sql.core.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:549)
位于com.google.cloud.sql.core.SslSocketFactory.getInstance(SslSocketFactory.java:140)
位于com.google.cloud.sql.mysql.SocketFactory.connect(SocketFactory.java:48)
在com.mysql.jdbc.MysqlIO上(MysqlIO.java:300)
位于com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2192)
位于com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2225)
... 还有13个
原因:java.io.IOException:从位置C:\Users\dell\AppData\Roaming\gcloud\application\u default\u credentials.json读取凭据文件时出错:握手期间远程主机关闭连接
在com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getCredentialUsingWellKnownFile(DefaultCredentialProvider.java:251)
位于com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredentialUnsynchronized(DefaultCredentialProvider.java:117)
在com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredential(DefaultCredentialProvider.java:91)
位于com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:213)
位于com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:191)
位于com.google.cloud.sql.core.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:547)
... 还有18个
我还运行了gcloud sql实例,并在以下位置生成了json文件:C:\Users\dell\AppData\Roaming\gcloud\application\u default\u credentials.json
您能指导我找出这个问题的实际原因和纠正方法吗?我通过自己的分析得出了答案,如下所示: 我添加了带有json文件(在运行gcloud auth应用程序默认登录时创建)的GOOGLE_APPLICATION_CREDENTIALS环境变量作为值 这解决了我的问题
谢谢。我通过自己的分析得出了答案,这是: 我添加了带有json文件(在运行gcloud auth应用程序默认登录时创建)的GOOGLE_APPLICATION_CREDENTIALS环境变量作为值 这解决了我的问题
谢谢。对于我来说,刚刚运行
gcloud auth应用程序默认登录就解决了问题。@RoyShilkrot非常感谢,这是我解决问题的方法。对于我来说,刚刚运行gcloud auth应用程序默认登录就解决了问题。@RoyShilkrot非常感谢,这是我解决问题的方法。