2009-06-12 7 views
25

Mi collego a un database MySQL (5.08) in esecuzione su una macchina Linux da un'applicazione Web in esecuzione in tomcat.Impossibile eseguire una procedura memorizzata MySQL da Java

ottengo la seguente eccezione quando si tenta di eseguire una stored procedure:

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 

Dopo l'installazione di MySQL sulla macchina. Ho dato le opzioni di finanziamento follwing per sradicare

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) 

Nella classe java ..

Sto collegandomi al db come segue:

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

Ho provato anche l'url con la Opzione noAccessToProcedureBodies=true inclusa.

Qualcuno può dirmi cosa c'è che non va qui? C'è qualcosa che devo controllare?

+0

scusate la sovvenzione dovrebbe leggere *. * Invece di. –

+0

Penso che i GRANT di MySQL non funzionino sempre come ci si potrebbe aspettare. A volte ho riscontrato che le cose funzionano se si utilizzano autorizzazioni GRANT specifiche anziché *. * – skaffman

risposta

52

Ci sono due modi per risolvere questo:

  1. impostare la proprietà della connessione noAccessToProcedureBodies=true

    Per esempio come parte della stringa di connessione:

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

    Il driver JDBC creerà Stringhe "INOUT" per gli argomenti senza richiedere metadati come dice l'eccezione.

  2. Concessione SELECT privilegi sul mysql.proc per l'utente del database

    Ad esempio, nel prompt di MySQL:

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

    Naturalmente questo permetterebbe l'applicazione per leggere l'intero mysql.proc tabella che contiene informazioni su tutte le stored procedure in tutti i database (incluso il codice sorgente).

+1

Il primo metodo non funziona per me e sto ricevendo lo stesso errore. – Kushal

+4

Questo (e http://stackoverflow.com/q/1880461/7708) sono esempi di ciò che non mi piace usare MySQL. –

+1

@Kush: nella mia particolare esperienza il Connector/J 5.1.12 sembra non conoscere il parametro noAccessToProcedureBodies; l'ultima (attualmente) versione 5.1.x, quella 5.1.26, ne è a conoscenza. Spero che questo ti aiuti. –

1

passi Seguendo lavorato per me in mysql

Fase 1: aggiungere follwong
Connection con = DriverManager.getConnection ("jdbc: mysql: // indirizzoip: 3306/LogParser noAccessToProcedureBodies = true", "root", "");

Passaggio 2: GRANT ALL ON logparser. proc TO root @ '%'; dove logparser è il nome del DB e proc è il nome della procedura.

0

L'esecuzione delle query deve risolvere il problema.

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

È possibile modificare il descrittore nella tabella mysql.proc sul proprio utente del database.

selezionare * da mysql.proc;

scegliere il proc memorizzato che presenta problemi e modificare il definitore in "yourdbuser" @ "localhost".