Неможливо підключитися до mysql через роз'єм JDBC через Tomcat або зовні


17

Я встановив інсталяцію stock mysql 5.5, і хоча я можу підключитися до служби mysql за допомогою команди mysql, і служба, здається, працює, я не можу підключитися до неї через spring + tomcat або через зовнішній роз'єм jdbc.

Я використовую таку URL-адресу:

jdbc:mysql://myserver.com:myport/mydb

з належним ім'ям користувача / паролем, але я отримую таке повідомлення:

server.com: 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.

і томат кидає:

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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

Здається, це те саме питання, як якщо б я намагався підключитися зовні.


Я зіткнувся з цією проблемою, намагаючись підключитися через Java до моєї бази даних mysql, яка працює на іншому сервері моєї локальної мережі. під час виконання тієї самої програми Java на сервері, який запускає mysql, він підключався без проблем. з зовнішньої машини я могла підключитися до бази даних mysql, наприклад, за допомогою SQLYog (хоча спочатку мені довелося змінити файл my.cnf, щоб він прив’язувався до 0,0.0.0 замість 127,0.0.1). Відповідь Бодена та коментар щодо зміни роз'єму JDBC вказали на мене в правильному напрямку. Я змінив роз'єм JDBC на останню версію і раптом він спрацював!
користувач2380870

Відповіді:


18

Це може статися з різних причин. Я щойно бачив це кілька тижнів тому, але не можу пригадати, що було для мене виправленням.

1) Перевірте, до якої зв'язаний mysql, це, ймовірно, 127.0.0.1 (лише), яке, на мою думку, є типовим (принаймні на стандартному сервері Ubuntu). Вам потрібно буде прокоментувати параметр bind-address у my.cnf, щоб прив’язати до всіх доступних адрес (ви не можете вибрати декілька, це один чи всі).

2) Якщо він прив’язаний до 127.0.0.1 і ви не можете підключитися за допомогою "localhost", переконайтеся, що він не вирішує адресу IPv6 localhost замість IPv4. (або просто скористайтеся IP-адресою)

3) Двічі та втричі перевірте порт, який mysql слухає.

4) Переконайтеся, що ви використовуєте правильний роз'єм JDBC для свого JDK.

5) Переконайтеся, що ви не робите чогось насправді нерозумного, як запустити mysql з --skip-мережею.

Я думаю, що моя перша пропозиція має найбільшою обіцянкою ... насправді я думаю, саме там я нещодавно побачив ... Я намагався віддалено підключитися до mysql (також на Ubuntu 8.04).


Тільки щоб додати мій 2цент, 4-й працював на мене. Спасибі!
Janis Peisenieks

1
щодо "Вам потрібно буде прокоментувати параметр bind-address у my.cnf, щоб прив’язати до всіх доступних адрес", за замовчуванням тепер потрібно слухати лише на localhost, тому вам може знадобитися використовувати рядок "bind-address = 0.0. 0,0 "в межах [mysqld].
Пало

13

У мене були дві проблеми в двох моїх програмах. Моя помилка була така:

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.

Я витрачаю кілька днів, щоб вирішити цю проблему. Я перевірив багато підходів, про які згадувалося на різних веб-сайтах, але жоден з них не працював. Нарешті я змінив код і з’ясував, у чому проблема. Я спробую розповісти вам про різні підходи та підсумувати їх тут .

Поки я шукав Інтернет, щоб знайти рішення для цієї помилки, я зрозумів, що існує багато рішень, які працювали принаймні на одну людину, але інші кажуть, що це не працює для них! чому існує багато підходів до цієї помилки? Здається, ця помилка може виникнути, як правило, коли є проблема підключення до сервера . Можливо, проблема полягає в тому, що неправильна рядок запиту або занадто багато підключень до бази даних.

Тому я пропоную вам спробувати всі рішення по одному і не здаватися!

Ось рішення, які я знайшов в Інтернеті, і для кожного з них є, принаймні, людина, яка вирішила його проблему з цим рішенням.

пункт: Для рішень, необхідних для зміни налаштувань MySQL, ви можете звернутися до наступного:

  • Linux: /etc/my.cnf

  • Windows: D: \ програмні файли \ mysql \ bin \ my.ini

Ось такі рішення:

  • зміна атрибута "bind-address"

Скасуйте атрибут "bind-address" або змініть його на один із наступних ips:

bind-address = "127.0.0.1"

або

bind-address = "0.0.0.0"

  • коментуючи "пропуск мережі"

Якщо у вашому файлі конфігурації MySQL є рядок "пропустити мережу", прокоментуйте це, додавши знак "#" на початку цього рядка.

  • змінити "wait_timeout" та "interactive_timeout"

Додайте ці рядки до файлу конфігурації MySQL:

wait_timeout = число

interactive_timeout = число

connect_timeout = число

  • перевірте налаштування проксі-операційної системи

Переконайтеся, що Fire Fire або антивірусні вироби не блокують службу MySQL.

  • змінити рядок з'єднання

Перевірте рядок запиту. у вашому рядку з'єднання має бути щось таке:

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

Переконайтеся, що у вашому рядку немає пробілів. Весь рядок з'єднання повинен бути продовжений без пробілів.

Спробуйте замінити "localhost" своїм портом, як-от 127.0.0.1. Спробуйте також додати номер порту до рядка з'єднання, наприклад:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

Зазвичай порту за замовчуванням для MySQL становить 3306.

Не забудьте змінити ім'я користувача та пароль на ім’я користувача та пароль вашого MySQL-сервера.

  • оновіть файл бібліотеки драйверів JDK
  • перевірити різні JDK та JRE (наприклад, JDK 6 та 7)
  • не змінювати max_allowed_packet

" max_allowed_packet " - це змінна в конфігураційному файлі MySQL, яка вказує на максимальний розмір пакета, а не на максимальну кількість пакетів. Тож вирішити цю помилку не допоможе.

  • змінити безпеку Tomcat

змінити TOMCAT6_SECURITY = так на TOMCAT6_SECURITY = ні

  • використовувати властивість validationQuery

використовуйте validationQuery = "select now ()", щоб переконатися, що кожен запит має відповіді

  • Автовідновлення

Додайте цей код до рядка з'єднання:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

Хоча не з цих рішень працювали для мене, я пропоную вам спробувати їх. Тому що є деякі люди, як вирішили свою проблему, виконуючи ці кроки.

Але що вирішило мою проблему? Моя проблема полягала в тому, що у мене було багато SELECT в базі даних. Кожен раз, коли я створював з'єднання, а потім закривав його. Хоча я закривав з'єднання кожного разу, але система зіткнулася з багатьма з’єднаннями і дала мені цю помилку. Що я зробив, це те, що я визначив свою змінну з'єднання як публічну (або приватну) змінну для цілого класу та ініціалізував її в конструкторі. Тоді щоразу я використовував це з'єднання. Це вирішило мою проблему, а також різко збільшило мою швидкість.

Висновок

Немає простого та унікального способу вирішення цієї проблеми. Я пропоную вам подумати над своєю власною ситуацією та вибрати вищевикладені рішення. Якщо ви допустите цю помилку на початку програми і взагалі не можете підключитися до бази даних, у вас може виникнути проблема в рядку підключення. Але якщо ви помилитеся після декількох успішних взаємодій із базою даних, проблема може бути у кількості підключень, і ви можете подумати про зміну "wait_timeout" та інших налаштувань MySQL або переписати свій код, як це зменшить кількість з'єднань.


У мене теж була ця проблема! Але я спочатку змінив mysql, щоб слухати порт 8888 замість 3306. Так, відповідь @ sohail допомогла, я просто додав порт 8888 до мого урі, і він працював! Дякую купу

Це вирішило для мене проблему! З нашою програмою Vagrant Homestead він чомусь прив’язується до адреси, наданої VM (в моєму випадку 10.0.2.15) замість localhost.
Ландер

1

Якщо ви працюєте з установкою Linux, у вас, ймовірно, є lokkit, що блокує вхідні комунікації, крім SSH.

Увійдіть як root і запустіть команду lokkit з підказки, відключіть брандмауер та SElinux і перевірте, чи є у вас однакова проблема.

Також переконайтеся, що ваші дозволи встановлені правильно, щоб все могло записувати у правильні місця.


Я працюю на Ubuntu 8.04. Я, мабуть, мав це згадати. Чи є у вас конкретні вказівки щодо цього дистрибутива? Я за секунду перейду в Google, але подумав, що попрошу спочатку.
Стефан Кендалл

sudo ufw disabled відключить брандмауер Ubuntu
Стівен Томпсон

Я встановив ufw і спробував включити порт, але без кісток.
Стефан Кендалл

ufw та iptables вже видалено. Я думав, що ufw - це інструмент управління, який потрібно було встановити окремо. Звичайно, "iptables" не дає такої команди, і жодна служба iptables, здається, не працює.
Стефан Кендалл

Нарешті, добре, що я часто виявляв - ви не дозволяєте mysql слухати інтерфейс eth0, а часто його лише на інтерфейсі localhost. Спробуйте наступне. Змініть jdbc: mysql: //myserver.com: myport / mydb на jdbc: mysql: // localhost: myport / mydb, якщо це працює, вам потрібно виконати наступні dev.mysql.com/doc/refman/5.1/uk/ can-not-connect-to-server.html
Стівен Томпсон


1

Це також може бути викликано неправильними налаштуваннями проксі-сервера . У мене була ця проблема, намагаючись підключитися через jdbc до екземпляра MySQL, що працює у віртуальному пристрої Parallels на моєму Mac. З'єднання jdbc використовує мережеві налаштування на системному рівні, і оскільки я був позаду проксі-сервера SOCKS, я повинен був встановити хост MySql як непроксі-хост (наприклад, на Mac можна налаштувати це в Налаштування-> Мережа-> Розширений- > Проксі, і, нарешті, додайте ім'я хоста або IP-адресу в "Налаштування проксі-проксі для цих хостів і доменів").


1

MySQL Connector / J підтримує лише TCP / IP Java не підтримує з'єднання доменних сокетів Unix

Якщо MYSQL запускається із прапором пропускної мережі або якщо MySQL працює за брандмауером, тоді параметр TCP / IP відключений. Так що Java не може спілкуватися з MySQL.


0

У мене була дуже схожа проблема майже день, і це мене зводило з розуму! але мені вдалося знайти рішення, і це було дуже, дуже просто, вам просто потрібно /etc/init.d/tomcat6 змінити TOMCAT6_SECURITY = так, щоб TOMCAT6_SECURITY = ні. це не моє рішення, я знайшов його тут , як бачите, я запускаю ubuntu, сподіваюся, це працює.


0

У мене була така ж проблема. Змінено властивість "bind-address" у файлі /etc/mysql/my.cnf на 0,0.0.0, і воно працює. Відповідний рядок у my.cnf виглядає так:

bind-address = 0.0.0.0

Перш ніж він був встановлений на зовнішній ip-адресу сервера, він виглядав приблизно так:

bind-address = 196.152.4.145

Я думаю, що коли він встановлений зовнішньою ip-адресою, а не циклом localhost, сервер mysql просто підключений до мережевої карти і не прослуховує з'єднання з локального циклу.


0

спробуйте свою локальну адресу, щоб прив’язати адресу до файлу my.cnf

З'єднання con = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.