programing

Java에서 MySQL 저장 프로시저를 실행할 수 없습니다.

skycolor 2023. 10. 9. 22:26
반응형

Java에서 MySQL 저장 프로시저를 실행할 수 없습니다.

tomcat에서 실행되는 웹 응용 프로그램에서 리눅스 시스템에서 실행되는 MySQL(5.08) 데이터베이스에 연결합니다.

저장 프로시저를 실행하려고 하면 다음 예외가 발생합니다.

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을 기계에 설치한 후.루트에 다음과 같은 grant 옵션을 부여했습니다.

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" 문자열을 만듭니다.

  2. 승인하다SELECT에 대한 특권.mysql.proc데이터베이스 사용자에게

    예를 들어, mysql 프롬프트에서:

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

    물론 이렇게 하면 애플리케이션이 전체를 읽을 수 있습니다.mysql.proc모든 데이터베이스(소스 코드 포함)에 저장된 모든 프로시저에 대한 정보를 포함하는 테이블.

아래 쿼리를 실행하면 문제가 해결됩니다.

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

mysql에서 다음 단계들이 나에게 효과가 있었습니다.

1단계 : follwong 추가
Connection con = DriverManager.getConnection("jdbc:mysql://ipaddress:3306/logparser?noAccessToProcedureBodys = true", "root", "");

2단계 : 모두 부여하기logparser.procTO root@'%'; 여기서 logparser는 DB 이름이고 proc는 procedure 이름입니다.

mysql.procable의 정의를 데이터베이스 사용자에게 변경할 수 있습니다.

mysql.proc에서 *를 선택합니다.

문제가 있는 저장 프로시저를 선택하고 정의를 'yourdbuser'@'localhost'로 변경합니다.

언급URL : https://stackoverflow.com/questions/986628/cant-execute-a-mysql-stored-procedure-from-java

반응형