Не удается выполнить хранимую процедуру MySQL из Java
Я подключаюсь к базе данных MySQL (5.08), работающей на Linux-машине, из веб-приложения, работающего в tomcat.
При попытке выполнить хранимую процедуру я получаю следующее исключение:
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 на машине. Я предоставил опции grantlwing для 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");
Я также попробовал URL с включенной опцией noAccessToProcedureBodies=true
.
Может кто-нибудь сказать мне, что здесь не так? Есть что-то, что мне нужно проверить?
Ответы
Ответ 1
Есть два способа решить эту проблему:
-
установить свойство noAccessToProcedureBodies=true
Например, как часть строки подключения:
jdbc:mysql://ipaddress:3306/test?noAccessToProcedureBodies=true
Драйвер JDBC затем создаст строки "INOUT" для аргументов, не требуя метаданных, как указано в сообщении.
-
Предоставить привилегии SELECT
для mysql.proc
для пользователя базы данных
Например, в приглашении mysql:
GRANT SELECT ON mysql.proc TO 'user'@'localhost';
Конечно, это позволит программе читать всю таблицу mysql.proc
, которая содержит информацию обо всех хранимых процедурах во всех базах данных (включая исходный код).
Ответ 2
Следующие шаги работали для меня в mysql
Шаг 1: добавьте описание
Соединение con = DriverManager.getConnection( "jdbc: mysql://ipaddress: 3306/logparser? NoAccessToProcedureBodies = true", "корень", "");
Шаг 2: GRANT ALL ON logparser
. proc
К root @'%'; где logparser - это имя базы данных, а proc - имя процедуры.
Ответ 3
Выполнение ниже запросов должно исправить вашу проблему.
GRANT <SELECT, CREATE, UPDATE, DELETE, ALL> PRIVILEGES ON mysql.proc TO '<user>'@'%';
FLUSH PRIVILEGES;