2009-06-12 6 views
25

Łączę się z bazą danych MySQL (5.08) uruchomioną na komputerze z systemem Linux z aplikacji internetowej działającej w tomcat.Nie można wykonać procedury przechowywanej MySQL z Java

otrzymuję następujący wyjątek, gdy próbuję wykonać procedurę przechowywaną:

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 

Po zainstalowaniu mysql na maszynie. Dałem follwing opcje grantowe wykorzenić

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) 

w klasie java ..

Łączę się db następująco:

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

Próbowałem również z url noAccessToProcedureBodies=true w zestawie.

Czy ktoś może mi powiedzieć, co jest nie tak? Czy jest coś, co muszę sprawdzić?

+0

Przepraszam, że dotacja powinna być odczytywana *. * Zamiast. –

+0

Uważam, że DOTACJE MySQL nie zawsze działają tak, jak można się spodziewać. Czasem zdarzało mi się, że rzeczy działają, jeśli używasz konkretnych uprawnień GRANT zamiast *. * – skaffman

Odpowiedz

52

Istnieją dwa sposoby, aby rozwiązać ten problem:

  1. skonfigurować połączenie za noAccessToProcedureBodies=true nieruchomość

    Na przykład jako część ciąg połączenia:

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

    Sterownik JDBC będzie następnie utworzyć Ciągi "INOUT" dla argumentów bez konieczności podawania metadanych, jak na przykład wyjątek.

  2. Grant SELECT przywileje mysql.proc do użytkownika bazy danych

    na przykład w wierszu MySQL:

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

    Oczywiście pozwoliłoby to aplikacja do zapoznania się z całą mysql.proc tabelę, która zawiera informacje o wszystkie przechowywane procedury w bazach danych wszystkie (w tym kod źródłowy).

+1

Pierwsza metoda nie działa dla mnie i otrzymuję ten sam błąd. – Kushal

+4

To (i http://stackoverflow.com/q/1880461/7708) są przykłady tego, co sprawia, że ​​nie lubię używać MySQL. –

+1

@Kush: Z mojego doświadczenia wynika, że ​​Connector/J 5.1.12 nie zna parametru noAccessToProcedureBodies; najnowsza (obecnie) wersja 5.1.x, wersja 5.1.26, jest tego świadoma. Mam nadzieję że to pomoże. –

1

Poniższe kroki pracował dla mnie w mysql

Krok 1: dodaj follwong
Connection con = DriverManager.getConnection ("jdbc: mysql: // ipaddress: 3306/LogParser noAccessToProcedureBodies = true" "root", "");

Krok 2: PRZYZNAJ WSZYSTKIE NA logparser. proc DO root'a @ '%'; gdzie logparser to nazwa bazy danych, a proc to nazwa procedury.

0

Uruchomienie poniższych zapytań powinno rozwiązać Twój problem.

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

Możesz zmienić definicję w tabeli mysql.proc dla użytkownika bazy danych.

wybierz * z mysql.proc;

wybierz przechowywany proc, który ma problem i zmień definicję na 'yourdbuser' @ 'localhost'.