我正在尝试在基于Java的项目和MySQL数据库之间建立连接。据我所知,数据库看起来很好(预期信息存储在其列中)。但是,当我使用Java程序打开连接时,我获得了StackOverflow错误,我不确定为什么会发生这种情况:
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)
我已经采取了几项措施来解决这个问题,但没有一个能够奏效。其中,我已经成功运行了MySQLJavaTutorials中描述的示例,这让我觉得这个问题不是因为JDBC连接器,操作系统,数据库本身或MySQL服务器版本。
但是,我注意到如果我完全删除数据库(通过执行DROP DATABASE mydatabase),我会得到完全相同的异常,就像数据库从未存在过一样。如果我将数据库的名称更改为故意不存在的名称,也会发生这种情况。我的机器使用:
操作系统:Ubuntu 64位14.04.5 LTS
MySQL服务器版本:5.5.58
Eclipse Oxygen 2
Java 1.8.0_151
你知道为什么会这样吗?
虽然我正在处理的项目相当复杂,但我调用该函数的调用位置是:
@Override
public void openDBConnection() throws Exception {
//this method establish a database connection
try {
// This will load the MySQL driver, each DB has its own driver
Class.forName(driver);
// Setup the connection with the DB
//////////////////////////////////////////////////////////////////////////////
String connection = "jdbc:mysql://" + host + "/" + dbname + "?"
+ "user=" + user + "&password=" + passwd + "&useSSL=false";
System.out.println(connection);
connect = DriverManager.getConnection(connection);
//////////////////////////////////////////////////////////////////////////////
} catch (ClassNotFoundException | SQLException e) {
throw e;
} finally {
}
}
在connect = DriverManager.getConnection(connection);
行抛出异常。我获得的连接字符串很好。实际上,我很确定这与JDBC connection
无关,因为如果我误写了驱动程序的名称,那么我会得到一个合理的错误而不是它。