Вопрос Невозможно реплицировать локальное соединение базы данных mysql


Я запускаю программу Java, содержащуюся в проекте Eclipse Java (Mars.2), который требует вставки данных в базу данных на базе MySQL. Когда я выполняю его в 32-битной виртуальной машине, на которой запущен Ubuntu 14.04 LTS с установленной mysql 5.5.55, она работает без проблем.

Однако, когда я пытаюсь перенести проект на хост (а не на виртуальную машину), который имеет 64 бита, имеет Eclipse Oxygen.1 и запускает тот же дистрибутив Ubuntu и имеет mysql 5.5.58 (ранее у меня был 5.5.57, но проблема остается прежней). Я получаю следующее исключение:

Exception in thread "Thread-2" java.lang.StackOverflowError
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)

Я предполагаю, что исключение StackOverflow связано с попыткой установить соединения с базой данных слишком много раз, поэтому я считаю, что это происходит, потому что есть некоторая ошибка в подключении к базе данных.

my.cnf файл конфигурации на обоих компьютерах одинаковый (мне не нужно изменять какой-либо IP-адрес, потому что я использую loopback-интерфейс в обоих случаях), поэтому я предполагаю, что это не связано с этим. Кроме того, код, который я использую, в обоих случаях точно такой же. Кто-нибудь имеет представление о том, что может произойти?

ОБНОВЛЕНИЕ: Я предпринял несколько действий для решения этой проблемы, но ни один из них не сработал. Среди них я успешно выполнил пример, описанный в http://www.vogella.com/tutorials/MySQLJava/article.html на обеих машинах, что заставляет меня думать, что эта проблема не связана ни с JDBC-коннектором (оба они отлично работали, несмотря на то, что они были разными версиями, они добавлены в путь сборки в Eclipse), различия в операционной системе, сама база данных (Я проверял содержимое нескольких столбцов в примере и тот, который я использую, и они такие же) или версию сервера MySQL (один компьютер имеет 5.5.55, а 64-разрядный - когда это происходит, - 5.5.58 , но оба они отлично работают).

Тем не менее, я заметил, что если я полностью удалю базу данных (выполнив DROP DATABASE mydatabase) на обеих машинах, я получаю разные результаты. В том, где он работает, я получаю исключение, говорящее мне, что база данных, к которой я пытаюсь подключиться, неизвестна (имеет смысл), тогда как другая машина предоставляет то же самое исключение, как если бы база данных никогда не существовала в первую очередь. Это также происходит, если я изменяю имя базы данных на то, что не существует специально (рабочий компьютер говорит, что он неизвестен, нерабочий механизм выдает одно и то же исключение). Может быть, это проблема, связанная с разрешениями, которые Eclipse имеет на одной из машин?


1
2017-12-14 11:33


происхождения


Похоже, Java не может найти класс для реализации JDBC. Вы добавили его в путь класса? Если он содержит родную библиотеку, включает ли он одну для 64-битной платформы? - David Foerster
@ hemangi-pithava: Спасибо за ваши предложения по редактированию! У меня есть только одна критика: пожалуйста, не форматируйте вещи как код, который является частью естественного языка, например. г. здесь «Eclipse Oxygen» является правильным существительным, происходящим на естественном языке, а не строкой или именем, переданным в компьютерную программу. my.cnf это действительно код, потому что это не естественный язык, а артефакт «языка», используемый для указания имен путей на компьютер. - David Foerster
Я попробовал проблему jdbc, которую вы упоминаете, используя более простой пример с тем же маршрутом и пакетом JDBC. более простой пример работает, но код все еще не работает. - Jesus


ответы:


Вы не можете просто копировать файлы mysql из одной версии в другую и ожидать, что базы данных будут работать. Сначала необходимо экспортировать базу данных:

mysqldump -u root -p yourdatabasename > yourdatabase.sql

А затем в машине назначения создайте новую базу данных:

CREATE DATABASE mynewdb;

и импортировать базу данных с нумерацией:

mysql -u root -p mynewdb  < yourdatabase.sql

Только таким образом гарантируется, что база данных может быть перенесена между различными версиями или операционными системами.


3
2017-12-14 11:41



Я действительно запускаю скрипт для создания новой базы данных на конечной машине, чтобы убедиться в этом. Тем не менее. Я сделал это так, как вы упоминаете (это, пожалуй, православный), и, к сожалению, проблема все еще сохраняется. - Jesus
Можете ли вы подтвердить, что база данных правильно импортирована на новый компьютер? Для этого введите mysql -u root -p и в консоли mysql use mynewdb а потом describe чтобы убедиться, что таблицы правильно импортированы. - paxt
Я не уверен, что понимаю, что вы имеете в виду. Если я нахожу mysql -u root -p и вхожу в passwoord, чтобы войти в меню sql, а затем использовать mynewdb, я получаю «Вы можете отключить эту функцию, чтобы быстрее запустить с -A Database changed». Но если тип описать или описать mynewdb, я получаю сообщение об ошибке, связанное с синтаксисом команды на обеих машинах (тот, где все работает, а другое). - Jesus