无法从Java执行MySQL存储过程

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

我尝试执行存储过程时收到以下exception:

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.(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类中..

我按如下方式连接到db:

 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”字符串,而不需要像exception所说的元数据。

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

    例如在mysql提示符中:

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

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

以下步骤在mysql中为我工作

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

第2步:GRANT ALL ON logparserproc to root @’%’; logparser是DB名称,proc是过程名称。

在查询下运行应解决您的问题。

 GRANT  PRIVILEGES ON mysql.proc TO ''@'%'; FLUSH PRIVILEGES; 

您可以将mysql.proc表中的定义器更改为数据库用户。

select * from mysql.proc;

选择存在问题的存储过程并将定义器更改为’yourdbuser’@’localhost’。