【发布时间】:2014-01-20 16:26:57
【问题描述】:
我使用应用引擎创建了一个 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 授权 App Engine 应用程序中。
有人在部署应用引擎 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 数据库设置为遵循应用程序引擎 servlet。另外,要知道这两种方法在本地运行 servlet 和访问云 sql 数据库时都可以正常工作。
有什么想法吗?我不知道还能尝试什么:[
【问题讨论】:
-
您是否更改了root@localhost 的密码?默认情况下,root@localhost 没有密码。有助于查看用户/密码状态的查询是
SELECT user,host,password FROM mysql.user。 -
我以为我在云控制台中更改了它。但是在运行该查询时,只为 % 用户设置了密码,localhost 是空白的。修改密码为空成功,谢谢!但是我也想为本地主机添加密码,我该怎么做?
-
您应该能够使用如下查询设置 root@localst 密码:
UPDATE mysql.user SET password = PASSWORD('XXXX') WHERE user = 'root' AND host = 'localhost'其中XXXX是您想要的密码。 -
还有一件事:不要忘记在更改 mysql.user 表后执行
FLUSH PRIVILEGES。否则 mysqld 将不会接受更改。
标签: java sql google-app-engine servlets google-cloud-sql