App Engine Java Servlet无法连接到Cloud SQL

时间:2014-01-03 03:51:50

标签: java sql google-app-engine servlets google-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://<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设置网址时,我按照此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数据库时都能正常工作。

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

5 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

向Google中的所有人展示您可能会遇到的原因&#34; com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通讯链接失败&#34;在连接上。

如果您是从测试服务器呼叫,请确保您的IP已被允许。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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