Я использую 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-адрес, поскольку в обоих случаях я использую интерфейс обратной связи), поэтому я предполагаю, что это не связано с этим. Кроме того, код, который я использую, абсолютно одинаков в обоих случаях. Кто-нибудь имеет представление о том, что может происходить?
ОБНОВЛЕНИЕ: Я предпринял несколько действий, чтобы решить эту проблему, но ни одно из них не сработало. Среди них я успешно выполнил пример, который описан в http://www.vogella.com/tutorials/MySQLJava/article.html на обеих машинах, что заставляет меня думать, что эта проблема не потому, что либо JDBC-коннектора (оба работали нормально, несмотря на то, что они разные версии; они добавляются в путь сборки в Eclipse), различия в операционной системе, сама база данных (я проверил содержимое нескольких столбцов в примере и тот, который я использую, и они одинаковы) или версия сервера MySQL (одна машина имеет 5.5.55, а 64-битная, когда возникает проблема, - 5.5.58, но обе они работают нормально).
Однако я заметил, что если я полностью удаляю базу данных (выполняя DROP DATABASE mydatabase) на обеих машинах, я получаю разные результаты. В той, где это работает, я получаю исключение, сообщающее, что база данных, к которой я пытаюсь подключиться, неизвестна (имеет смысл), тогда как другая машина выдает точно такое же исключение, как если бы база данных никогда не существовала вообще. Это также происходит, если я изменяю имя базы данных на имя, которое специально не существует (рабочая машина говорит, что она неизвестна, нерабочая машина выдает то же исключение). Может ли это быть проблема, связанная с разрешениями, которые Eclipse имеет на одной из машин?
Вы не можете просто скопировать файлы mysql из одной версии в другую и ожидать, что базы данных будут работать. Сначала необходимо экспортировать базу данных:
mysqldump -u root -p yourdatabasename > yourdatabase.sql
А затем на конечном компьютере создайте новую базу данных:
CREATE DATABASE mynewdb;
и импортируйте базу данных с дампами:
mysql -u root -p mynewdb < yourdatabase.sql
Только таким образом гарантируется, что база данных может быть перенесена между различными версиями или операционными системами.