部署到云后无法访问MySQL数据库 - CommunicationsException

时间:2016-03-31 13:23:16

标签: java mysql rest google-app-engine google-cloud-sql

我通过App Engine Java Rest API Project连接到我的Google Cloud SQL,以检索和存储我的云上的数据。我可以通过Localhost与服务器成功通信,但在我发布后,我收到此错误:

  

尝试运行查询:   com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:   通讯链接失败

     

成功发送到服务器的最后一个数据包是0毫秒   前。驱动程序未收到来自服务器的任何数据包。

虽然有' S这么多的解决方案在那里,我' M伤心地说他们没有工作。

这是我的连接字符串:

String url = null;
try {
    if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
        Class.forName("com.mysql.jdbc.GoogleDriver");
        url = "jdbc:google:mysql://APP_ENGINE_ID:SQL_INSTANCE_NAME/DB_NAME?user=root";
    } else {
        Class.forName("com.mysql.jdbc.Driver");
        url = "jdbc:mysql://MY_IPV4_ADDRESS:3306/DB_NAME?user=root";
    }
} catch (Exception e) {
    e.printStackTrace();
}

我只在发布后通过我的Rest API收到此错误。基本上,它通过Localhost工作,但不能远程工作在云端。

我进行了调试并确定了它崩溃的位置。它在我尝试与服务器建立连接并执行查询后发生:

try {
    //THIS is where it crashes
    conn = DriverManager.getConnection(url);
    try {
        String query = "SELECT * FROM UserTable";
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery(query);
        while (rs.next())
        {
            //Code
        }
        st.close();
    } finally {
        conn.close();
    }
} catch (SQLException e) {
    e.printStackTrace();
}

以前有人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:1)

像Herman一样,Igor和Vadim指出,这行中的PROJECT_ID:INSTANCE_ID是一个简单的错误:

代码不正确:

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
    Class.forName("com.mysql.jdbc.GoogleDriver");
    url = "jdbc:google:mysql://APP_ENGINE_ID:SQL_INSTANCE_NAME/DB_NAME?user=root";
}

我一直在使用我的应用引擎ID ,而不是我应该使用的项目ID

更正后的代码:

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
    Class.forName("com.mysql.jdbc.GoogleDriver");
    url = "jdbc:google:mysql://PROJECT_ID:SQL_INSTANCE_NAME/DB_NAME?user=root";
}

答案 1 :(得分:-1)

你可以看到我在Android中使用asyncTask调用(与java中的Thread相同)

public class Connect extends AsyncTask<Context, Integer, Long> 
 {
  protected Long doInBackground(Context... contexts) {

    Connection connection;
    String query = "Some query";
    try {
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection("jdbc:mysql://<your cloud IP address>/<database schema you want to connect to>", "<user>", "<password>");

        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery(query);

希望你现在得到它:)。