【问题标题】:Cannot insert information in MySQL无法在 MySQL 中插入信息
【发布时间】:2018-03-12 13:04:20
【问题描述】:

我正在尝试使用我用 Java 编写的程序在数据库中本地插入信息,但我无法做到。我的猜测是它在某种程度上与用户权限有关,即使我不知道除了我已经拥有的东西我应该做什么。我的操作系统是 Ubuntu 14.04.05 LTS。我的操作如下:

我打开一个命令行界面窗口并通过

进入 MySQL
mysql -u root -p

然后我输入root的密码并进入。

我将必须使用的数据库设置为数据

use_data;

我创建了一个新用户

CREATE USER 'user'@'localhost' IDENTIFIED BY 'passw';

我赋予用户写入信息所需的所有权限,无论使用的 IP 是什么:

GRANT USAGE ON * . * TO 'user'@'localhost' IDENTIFIED BY 'passw' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT USAGE ON * . * TO 'user'@'%' IDENTIFIED BY 'passw' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT USAGE ON * . * TO 'user'@'linux' IDENTIFIED BY 'passw' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT ALL PRIVILEGES ON `data` . * TO 'user'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `data` . * TO 'user'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `data` . * TO 'user'@'linux' WITH GRANT OPTION;

然而,当我尝试访问数据库以插入信息时,出现以下异常:

Exception in thread "Thread-3" 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)

谁能告诉我我做错了什么没有在我的 Java 代码和数据库之间获得连接?当我尝试访问数据库时,抛出异常的部分代码在方法 getConnection 中。

@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);

            String connection = "jdbc:mysql://" + host + "/" + dbname + "?"
                    + "user=" + user + "&password=" + passwd + "&useSSL=false"; 
            System.out.println(connection);

            // Setup the connection with the DB
            connect = DriverManager.getConnection("jdbc:mysql://" + host + "/" + dbname + "?"
                    + "user=" + user + "&password=" + passwd + "&useSSL=false");

        } catch (ClassNotFoundException | SQLException e) {
            throw e;
        } finally {
        }
    }

【问题讨论】:

  • 您在启动应用程序时使用的 Java VM 参数是什么?
  • driver 的值是多少?您使用的是哪个版本的 MySQL Connector/J 驱动程序,您的 Java 版本是多少?
  • 驱动是“com.mysql.jdbc.Driver”

标签: java mysql jdbc permissions


【解决方案1】:

好吧,您应该尝试检查 de driver 值(对于Class.forName(driver) 行),并确保您访问的是正确的类。

此外,错误提示 您的堆栈中没有足够的内存,因此您可以更改 JVM 堆栈大小 以增加此值(您可以使用 @ 987654322@jvm参数)

【讨论】:

  • 在正常情况下,4 MB 的堆栈有点极端,不需要进行类加载
  • 驱动是“com.mysql.jdbc.Driver”。我知道错误的潜在意义,但我确信它是由于尝试多次访问相同的结果(因此重复跟踪)而发生的,而不是因为代码要求太高。另外,我已经执行了一个示例 (vogella.com/tutorials/MySQLJava/article.html),它很成功,没有 JDBC 或 MySQL 问题。
  • 无论如何,我已经尝试过了,将它添加到 Eclipse 后,同样的错误发生了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多