无法从 Java 执行 MySQL 存储过程

2022-09-01 08:08:49

我正在从在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");

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

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


答案 1

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

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

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

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

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

  2. 向数据库用户授予权限SELECTmysql.proc

    例如,在 mysql 提示符中:

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

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


答案 2

以下步骤在 mysql 中对我有用

Step 1 : add follwong
Connection con = DriverManager.getConnection(“jdbc:mysql://ipaddress:3306/logparser?noAccessToProcedureBodies = true ”, “root”, “”);

步骤 2 : 授予所有 .to root@'%';其中 logparser 是 DB 名称,proc 是过程名称。logparserproc


推荐