Я подключаюсь к своему Google Cloud SQL через свой проект Java Rest API в App Engine, чтобы получать и хранить данные в моем облаке. Я могу успешно общаться с сервером через Localhost, но после публикации я получаю такую ошибку:

Попытка запустить запрос: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Сбой канала связи

Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил пакетов от сервера.

Хотя существует так много решений, к сожалению, ни одно из них не сработало.

Вот моя строка подключения:

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();
}

Кто-нибудь раньше сталкивался с этой проблемой?

0
Dinuka Jay 31 Мар 2016 в 16:23

2 ответа

Лучший ответ

Как указали Герман, Игорь и Вадим, это была просто ошибка в моем 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";
}

Я использовал свой идентификатор механизма приложений вместо идентификатора проекта , который должен был использоваться.

Исправленный код:

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
Dinuka Jay 1 Апр 2016 в 09:58

Как вы можете видеть, я позвонил с помощью asyncTask в Android (так же, как Thread в java)

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);

Надеюсь, ты понял сейчас :)

-1
pratik 31 Мар 2016 в 14:15