Невозможно реплицировать локальное соединение базы данных 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 (I был установлен 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-интерфейс в обоих случаях), поэтому я предполагаю, что это не связано с этим. Кроме того, код, который я использую, в обоих случаях точно такой же.

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

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

1
задан 8 January 2018 в 20:40

2 ответа

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

mysqldump -u root -p yourdatabasename > yourdatabase.sql

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

CREATE DATABASE mynewdb;

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

mysql -u root -p mynewdb < yourdatabase.sql

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

3
ответ дан 18 July 2018 в 01:12

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

mysqldump -u root -p yourdatabasename > yourdatabase.sql

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

CREATE DATABASE mynewdb;

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

mysql -u root -p mynewdb < yourdatabase.sql

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

3
ответ дан 24 July 2018 в 17:21
  • 1
    Я действительно запускаю скрипт для создания новой базы данных на конечной машине, чтобы убедиться в этом. Тем не менее. Я сделал это так, как вы упоминаете (это, пожалуй, православный), и, к сожалению, проблема все еще сохраняется. – Jesus 14 December 2017 в 16:09
  • 2
    Можете ли вы подтвердить, что база данных правильно импортирована на новый компьютер? Для этого введите mysql -u root -p и в консоли mysql use mynewdb, а затем describe, чтобы увидеть, правильно ли импортированы таблицы. – paxt 14 December 2017 в 16:24
  • 3
    Я не уверен, что понимаю, что вы имеете в виду. Если я нахожу mysql -u root -p и вхожу в passwoord, чтобы войти в меню sql, а затем использовать mynewdb, я получаю & quot; Вы можете отключить эту функцию, чтобы быстрее запустить с -A Database changed & quot ;. Но если тип описать или описать mynewdb, я получаю сообщение об ошибке, связанное с синтаксисом команды на обеих машинах (тот, где все работает, а другое). – Jesus 14 December 2017 в 17:33

Другие вопросы по тегам:

Похожие вопросы: