我正在运行 Eclipse Java 项目 (Mars.2) 中的一个 Java 程序,它需要在基于 MySQL 的数据库中插入数据。当我在安装了 mysql 5.5.55 的 Ubuntu 14.04 LTS 的 32 位虚拟机中执行它时,它运行没有问题。
但是,当我尝试将项目移植到 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 在其中一台机器上的权限有关的问题吗?
答案1
您不能只是将 mysql 文件从一个版本复制到另一个版本并期望数据库可以正常工作。您首先需要导出数据库:
mysqldump -u root -p yourdatabasename > yourdatabase.sql
然后在目标机器上创建一个新的数据库:
CREATE DATABASE mynewdb;
并导入转储的数据库:
mysql -u root -p mynewdb < yourdatabase.sql
只有这样才能保证数据库可以在不同版本或操作系统之间迁移。