簡體   English   中英

無法通過Java執行MySQL存儲過程

[英]Can't execute a MySQL stored procedure from Java

我正在從在tomcat中運行的Web應用程序連接到在Linux機器上運行的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之后。 我已經將以下授予選項授予根目錄

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類中。

我連接到數據庫,如下所示:

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

我還嘗試了包含noAccessToProcedureBodies=true選項的url。

有人可以告訴我這里有什么問題嗎? 我需要檢查什么嗎?

有兩種解決方法:

  1. 設置連接的noAccessToProcedureBodies=true屬性

    例如,作為連接字符串的一部分:

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

    然后,JDBC驅動程序將為參數創建“ INOUT”字符串,而不需要像異常說明那樣的元數據。

  2. 向數據庫用戶授予mysql.proc上的SELECT特權

    例如在mysql提示符下:

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

    當然,這將允許應用程序讀取整個mysql.proc表,該表包含有關所有數據庫中所有存儲過程的信息(包括源代碼)。

以下步驟在mysql中為我工作

步驟1:添加follwong
連接con = DriverManager.getConnection(“ jdbc:mysql:// ipaddress:3306 / logparser?noAccessToProcedureBodies = true”,“ root”,“”);

步驟2:將所有內容logparser proc TO root @'%'; 其中logparser是數據庫名稱,而proc是過程名稱。

在查詢下面運行可以解決您的問題。

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

您可以將mysql.proc表中的定義器更改為數據庫用戶。

從mysql.proc選擇*;

選擇有問題的存儲過程,然后將定義器更改為“ yourdbuser” @“ localhost”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM