App Engine Java Servlet无法连接到Cloud SQL

我使用app引擎创建了一个java web servlet,servlet向数据库发出请求。 我已经使用本地数据库在本地测试了servlet并且它运行良好,然后我继续在本地测试servlet但是仍然访问了Cloud SQL数据库,这也很有效。

我部署servlet后出现问题。 部署完所有数据库请求后返回以下内容:

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. 

我在云控制台中检查了一下,我的应用程序已正确添加到访问控制选项卡下的云SQL授权应用程序引擎应用程序中。

是否有人在部署的应用引擎servlet上遇到过类似的问题? 那里有任何解决方案或建议吗? 我将不胜感激任何帮助!

更新:

使用以下代码生成上述错误以访问db

 Class.forName("com.mysql.jdbc.Driver"); Url = "jdbc:mysql://:3306/"; Connection con = DriverManager.getConnection (Url,"root",); 

使用此代码实现了同样的错误,请注意它与此处示例中显示的代码非常相似https://developers.google.com/appengine/docs/java/cloud-sql/

 Class.forName("com.mysql.jdbc.GoogleDriver"); Url = "jdbc:google:mysql:///? user=root&password="; Connection con = DriverManager.getConnection (Url); 

当我使用appid和实例id来设置url时,我按照此stackoverflow文章中的格式化提示显示: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:

使用此代码导致以下不同的错误:

 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) 

我假设它说localhost因为我的cloudsql数据库设置为遵循app引擎servlet。 另外,要知道在本地运行servlet和访问云sql数据库时,这两种方法都能正常工作。

有什么想法吗? 我不知道还有什么可以尝试:[

从授权的App Engine应用程序连接到Cloud SQL时,不需要密码(实际上,如果您尝试使用密码连接,则会失败)。

将您的连接字符串更改为jdbc:google:mysql:///? user=root jdbc:google:mysql:///? user=root省略&password=部分

如果您拥有授权的应用程序引擎应用程序您在访问控制设置上的app引擎,则您不需要密码,因为它是本地密码,所以只需输入密码=“”; 但是,如果您使用远程的东西,例如从其他主机运行的phpmyadmin,您的命令行或通过TCP,SSH或HTML运行的GCE VM,则需要输入密码=“something”; 您在访问控制中设置的内容。

谷歌的每个人都在查看为什么你可能会在连接上收到“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure”。

如果从测试服务器调用,请确保允许使用IP。

我在朋友家测试,这个无益的错误不断出现。

连接到Google Cloud Sql时,您应该小心: – 关闭已打开的连接 – 在尝试创建新连接时使用指数退避算法。 有关详细信息,请参阅: https : //cloud.google.com/sql/faq

如果您在Spring Boot应用application.properties中使用application.properties ,那么只需将以下行放入application.properties

 spring.datasource.url: jdbc:mysql://google/?cloudSqlInstance=&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=****&password=****