2009-06-12 9 views
25

Me estoy conectando a una base de datos MySQL (5.08) que se ejecuta en una máquina Linux desde una aplicación web que se ejecuta en tomcat.No se puede ejecutar un procedimiento almacenado de MySQL desde Java

tengo la siguiente excepción cuando trato de ejecutar un procedimiento almacenado:

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 

Después de instalar MySQL en la máquina. Me he dado las opciones de subvención siguientes aparatos para erradicar

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) 

En la clase java ..

lo voy a conectar a la base de datos de la siguiente manera:

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

También he probado la url con el noAccessToProcedureBodies=true opción incluida.

¿Alguien me puede decir lo que está mal aquí? ¿Hay algo que deba verificar?

+0

siento que la concesión debería leer *. * En lugar de. –

+0

Creo que los GRANTs de MySQL no siempre funcionan como cabría esperar. A veces descubrí que las cosas funcionan si usa permisos específicos de GRANT en lugar de *. * – skaffman

Respuesta

52

Hay dos maneras de resolver este:

  1. establecer noAccessToProcedureBodies=true la propiedad de la conexión

    Por ejemplo, como parte de la cadena de conexión:

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

    El controlador JDBC creará entonces Las cadenas "INOUT" para los argumentos sin requerir metadatos como la excepción dice.

  2. subvención SELECT privilegios en mysql.proc para el usuario de base de datos

    Por ejemplo, en el símbolo del mysql:

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

    Por supuesto, esto permitiría a la aplicación leer toda la tabla mysql.proc que contiene información sobre todos los procedimientos almacenados en todas las bases de datos (incluido el código fuente).

+1

El primer método no funciona para mí y recibo el mismo error. – Kushal

+4

Esto (y http://stackoverflow.com/q/1880461/7708) son ejemplos de lo que no me gusta usar MySQL. –

+1

@Kush: en mi experiencia particular, el Connector/J 5.1.12 no parece conocer el parámetro noAccessToProcedureBodies; la última versión (actualmente) 5.1.x, la 5.1.26, es consciente de ello. Espero que esto ayude. –

1

Los siguientes pasos trabajaron para mí en MySQL

Paso 1: agregar follwong
conexión con = DriverManager.getConnection ("jdbc: mysql: // IP address: 3306/LogParser noAccessToProcedureBodies = true", "raíz", "");

Paso 2: GRANT TODO EN logparser. proc TO root @ '%'; donde logparser es el nombre de DB y proc es el nombre del procedimiento.

0

La ejecución de consultas a continuación debería solucionar su problema.

GRANT <SELECT, CREATE, UPDATE, DELETE, ALL> PRIVILEGES ON mysql.proc TO '<user>'@'%'; 
FLUSH PRIVILEGES; 
0

Puede cambiar el definidor en la tabla mysql.proc a su usuario de la base de datos.

select * from mysql.proc;

seleccione el proceso almacenado que tiene problema y cambie el definidor a 'yourdbuser' @ 'localhost'.

Cuestiones relacionadas