Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 连接到Google SQL时无法从数据源确定jdbc url_Java_Spring Boot_Jdbc_Google Cloud Platform_Google Cloud Sql - Fatal编程技术网

Java 连接到Google SQL时无法从数据源确定jdbc url

Java 连接到Google SQL时无法从数据源确定jdbc url,java,spring-boot,jdbc,google-cloud-platform,google-cloud-sql,Java,Spring Boot,Jdbc,Google Cloud Platform,Google Cloud Sql,这有点奇怪 在过去的一周内,我已经能够连接到我在GCP中创建的测试数据库。我没有下载凭据,也没有使用cred配置更改任何内容。我只是更新了application.properties中的数据库源url 我仍然可以在本地连接,没有问题 这是相关的application.properties部分: # =============================== # = DATA SOURCE # =============================== # Set here confi

这有点奇怪

在过去的一周内,我已经能够连接到我在GCP中创建的测试数据库。我没有下载凭据,也没有使用cred配置更改任何内容。我只是更新了application.properties中的数据库源url

  • 我仍然可以在本地连接,没有问题
这是相关的application.properties部分:

# ===============================
# = DATA SOURCE
# ===============================
# Set here configurations for the database connection
#spring.datasource.url=jdbc:mysql://localhost:3306/gametest
#gcp
#spring.datasource.url=jdbc:mysql://35.222.131.172:3306/gametest
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
今天,我尝试连接并接收此异常

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_45]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_45]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_45]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[na:1.8.0_45]
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:342) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2188) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2221) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2016) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:776) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_45]
    at
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)~[na:1.8.0\u 45]
在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)~[na:1.8.0\U 45]
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)~[na:1.8.045]
在java.lang.reflect.Constructor.newInstance(Constructor.java:422)~[na:1.8.0_45]
在com.mysql.jdbc.Util.handleNewInstance(Util.java:425)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.MysqlIO.(MysqlIO.java:342)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2188)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.ConnectionImpl.connectoneryOnly(ConnectionImpl.java:2221)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2016)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:776)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47)~[mysql-connector-java-5.1.46.jar:5.1.46]
在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)~[na:1.8.0\u 45]
在
我查过: -我可以使用云终端连接到谷歌数据库

-数据库已启动并运行

-没有防火墙等

-应用程序没有发生任何戏剧性的变化(添加了存储方法,没有其他)

  • 我尝试在连接之前使用终端将我的IP列入白名单
  • 我检查了云日志,它正在启动、运行并等待连接
  • 我没有滥发连接,所以那里不应该有问题
  • 仔细检查pom.xml以确保JDBC仍然存在
  • 对属性和pom进行比较,以检查是否存在不可靠的内容
以下是一些SO帖子,我发现有人建议这是正确的方法:

spring.datasource.url=jdbc:mysql://google/<DBNAME>?cloudSqlInstance=<MYDABINSTANCENAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory
spring.datasource.url=jdbc:mysql://google/?cloudSqlInstance=&socketFactory=com.google.cloud.sql.mysql.SocketFactory
我在中添加了这一点,现在收到另一个指向API凭据的异常

    Caused by: java.lang.RuntimeException: Unable to obtain credentials to communicate with the Cloud SQL API
    at com.google.cloud.sql.mysql.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:545) ~[mysql-socket-factory-1.0.0.jar:na]
    at com.google.cloud.sql.mysql.SslSocketFactory.getInstance(SslSocketFactory.java:138) ~[mysql-socket-factory-1.0.0.jar:na]
    at com.google.cloud.sql.mysql.SocketFactory.connect(SocketFactory.java:47) ~[mysql-socket-factory-1.0.0.jar:na]
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:301) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2188) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2221) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    ... 61 common frames omitted
Caused by: java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. 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:95) ~[google-api-client-1.21.0.jar:1.21.0]
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:213) ~[google-api-client-1.21.0.jar:1.21.0]
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:191) ~[google-api-client-1.21.0.jar:1.21.0]
    at com.google.cloud.sql.mysql.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:543) ~[mysql-socket-factory-1.0.0.jar:na]
    ... 66 common frames omitted
原因:java.lang.RuntimeException:无法获取与云SQL API通信的凭据
在com.google.cloud.sql.mysql.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:545)~[mysql-socket-factory-1.0.0.jar:na]
在com.google.cloud.sql.mysql.SslSocketFactory.getInstance(SslSocketFactory.java:138)~[mysql-socket-factory-1.0.0.jar:na]
在com.google.cloud.sql.mysql.SocketFactory.connect(SocketFactory.java:47)~[mysql-socket-factory-1.0.0.jar:na]
在com.mysql.jdbc.MysqlIO.(MysqlIO.java:301)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2188)~[mysql-connector-java-5.1.46.jar:5.1.46]
在com.mysql.jdbc.ConnectionImpl.connectoneryOnly(ConnectionImpl.java:2221)~[mysql-connector-java-5.1.46.jar:5.1.46]
... 省略了61个公共帧
原因:java.io.IOException:应用程序默认凭据不可用。如果在谷歌计算引擎中运行,它们是可用的。否则,必须定义指向定义凭据的文件的环境变量GOOGLE\u APPLICATION\u CREDENTIALS。看见https://developers.google.com/accounts/docs/application-default-credentials 了解更多信息。
在com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredential(DefaultCredentialProvider.java:95)~[google-api-client-1.21.0.jar:1.21.0]
在com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:213)~[google-api-client-1.21.0.jar:1.21.0]
在com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:191)~[google-api-client-1.21.0.jar:1.21.0]
在com.google.cloud.sql.mysql.SslSocketFactory$ApplicationDefaultCredentialFactory.create(SslSocketFactory.java:543)~[mysql-socket-factory-1.0.0.jar:na]
... 省略66个公共框架
所以,我的问题是——有人知道为什么它以前有效,为什么现在无效吗?我是否需要凭据文件才能工作?如果需要,上次我是如何轻松连接的?在我发布的这两种方法中,有谁能告诉我,在不必为了连接到数据库而跳过太多的障碍的情况下,定义数据源的最佳方法是什么


提前谢谢

我会删除这个,但它可能会帮助其他人

我的IP不是静态的,在SQL实例的连接页面上,我的IP是一个授权的公共IP。这是我的家庭IP,但后来发生了变化