Я запускаю программу 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 имеет на одной из машин?
Вы не можете просто копировать файлы mysql из одной версии в другую и ожидать, что базы данных будут работать. Сначала вам нужно экспортировать базу данных:
mysqldump -u root -p yourdatabasename > yourdatabase.sql
И затем на машине назначения создайте новую базу данных:
CREATE DATABASE mynewdb;
и импортируйте нумерованную базу данных:
mysql -u root -p mynewdb < yourdatabase.sql
Только таким образом гарантируется, что база данных может быть перенесена между различными версиями или операционными системами.
Вы не можете просто копировать файлы mysql из одной версии в другую и ожидать, что базы данных будут работать. Сначала вам нужно экспортировать базу данных:
mysqldump -u root -p yourdatabasename > yourdatabase.sql
И затем на машине назначения создайте новую базу данных:
CREATE DATABASE mynewdb;
и импортируйте нумерованную базу данных:
mysql -u root -p mynewdb < yourdatabase.sql
Только таким образом гарантируется, что база данных может быть перенесена между различными версиями или операционными системами.