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
옵션 포함.
누가 여기에 무엇이 문제인지 말해 줄 수 있습니까?제가 확인해야 할 사항이 있습니까?
이를 해결하는 두 가지 방법이 있습니다.
연결을 설정합니다.
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
모든 데이터베이스(소스 코드 포함)에 저장된 모든 프로시저에 대한 정보를 포함하는 테이블.
아래 쿼리를 실행하면 문제가 해결됩니다.
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
.proc
TO 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
'programing' 카테고리의 다른 글
내부 지시어에서 컨트롤러 모델 값 보기 (0) | 2023.10.09 |
---|---|
CLion을 사용하여 포크된 자식 프로세스를 디버그하는 방법 (0) | 2023.10.09 |
포함 범위에서 임의 부동 소수점 두 배 (0) | 2023.10.09 |
mysqlworkbench를 사용하여 테이블 구조만 내보내기 (0) | 2023.10.09 |
관리자와 직원을 연결하는 방법 (0) | 2023.10.09 |