我使用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://<ip-address-cloudsql>:3306/<dbname>";
Connection con = DriverManager.getConnection (Url,"root",<password>);
使用此代码实现了同样的错误,请注意它与此处示例中显示的代码非常相似https://developers.google.com/appengine/docs/java/cloud-sql/
Class.forName("com.mysql.jdbc.GoogleDriver");
Url = "jdbc:google:mysql://<appID:instanceID>/<dbname>?
user=root&password=<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和访问cloud sql数据库时都能正常工作。
有什么想法吗? 我不知道还有什么可以尝试:[
从授权的App Engine应用程序连接到Cloud SQL时,不需要密码(实际上,如果您尝试使用密码连接,则会失败)。
将您的连接字符串更改为jdbc:google:mysql://<appID:instanceID>/<dbname>? user=root
jdbc:google:mysql://<appID:instanceID>/<dbname>? user=root
省略&password=<password>
部分
如果您在访问控制设置上有应用程序引擎应用程序,那么您不需要密码,因为它是本地的,所以只需输入密码=“”; 但是,如果您正在使用远程某些东西,例如从其他主机运行的phpmyadmin,您的命令行或通过TCP,SSH或HTML运行的GCE VM,则需要输入密码=“something”; 您在访问控制中设置的内容。
对于Google上的所有人,他们都在考虑为什么您可能在连接上遇到“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/<dbname>?cloudSqlInstance=<InstanceName>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=****&password=****