java - 无法从 Java 执行 MySQL 存储过程

标签 java mysql stored-procedures privileges

我正在从在 tomcat 中运行的 Web 应用程序连接到在 Linux 机器上运行的 MySQL (5.08) 数据库。

当我尝试执行存储过程时出现以下异常:

com.hp.hpl.chaos.web.exception.DBException: getNextValue for operatorinstance[Additional Information from SQL Exception][SQLErrorCode: 0 SQLState: S1000
    at com.hp.hpl.chaos.web.util.SQLUtil.getNextValue(SQLUtil.java:207)
        ..............

Caused by: java.sql.SQLException: User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with "noAccessToProcedureBodies=true" to have driver generate parameters that represent INOUT strings irregardless of actual parameter types.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(DatabaseMetaData.java:1619)
at com.mysql.jdbc.DatabaseMetaData.getProcedureColumns(DatabaseMetaData.java:4034)
at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:709)
at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)
at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4583)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4657)
at com.mysql.jdbc.Connection.prepareCall(Connection.java:4631)
at com.hp.hpl.chaos.web.util.SQLUtil.getNextValue(SQLUtil.java:196)
... 17 more

在机器上安装mysql之后。我已将以下授权选项授予 root

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'pass';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

在java类中..

我按如下方式连接到数据库:

String url = "jdbc:mysql://ipaddress:3306/test";
                con = DriverManager.getConnection(url,"root", "pass");

我还尝试了包含 noAccessToProcedureBodies=true 选项的 url。

有人能告诉我这里有什么问题吗?有什么我需要检查的吗?

最佳答案

有两种方法可以解决这个问题:

  1. 设置连接的 noAccessToProcedureBodies=true 属性

    例如作为连接字符串的一部分:

    jdbc:mysql://ipaddress:3306/test?noAccessToProcedureBodies=true
    

    然后 JDBC 驱动程序将为参数创建“INOUT”字符串,而不需要像异常所说的元数据。

  2. 授予数据库用户 mysql.procSELECT 权限

    例如在mysql提示符下:

    GRANT SELECT ON mysql.proc TO 'user'@'localhost';
    

    当然,这将允许应用程序读取整个 mysql.proc 表,该表包含有关所有 数据库中所有 存储过程的信息(包括源代码)。

关于java - 无法从 Java 执行 MySQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6348278/

相关文章:

java - 城市间最大非重叠桥梁算法

java - 插入 Hashtable<Character, List<Boolean>>

mysql - 如何保存并重新加载 MySQL 查询缓存以保持站点以峰值速度运行

sql - 错误 SQL70001 : This statement is not recognized in this context

java - 不知道怎么重画

java - 相当于套接字连接的 SerialPortEvent

python - 将文件写入本地 SQL DB

php - 我可以在一台主机上使用我的 mysql 数据库,而在另一台主机上使用我的服务器文件吗?

mysql - 重命名mysql数据库中所有表的列

java - 如何从jdbc中带参数的存储过程中获取结果集