调用MySQL过程有时会导致异常“不正确的整数值:'@ com_mysql_jdbc_outparam_11'对于第1行的列'_NewID'”

时间:2013-04-03 13:01:00

标签: java mysql jdbc

我从Java JDBC驱动程序调用MySQL中的存储过程时偶尔会遇到一个奇怪的异常。 我的应用程序代码如下:

int newID = 0;
if (myObj != null) 
   newID = myObj.getId(); //getId() returns an int value...
CallableStatement stmt = conn.prepareCall("{CALL MySP(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}");          
stmt.registerOutParameter(14, Types.INTEGER);
stmt.registerOutParameter(15, Types.BIT);

stmt.setShort(1, status);
... // other setters for each parameter of the stored procedure
stmt.setInt(14, newID);

stmt.execute();

newID = stmt.getInt(14);    
createdNew = stmt.getBoolean(15);

执行该语句会导致99%的案例成功,除了引发异常的几次:

java.sql.SQLException: Incorrect integer value: '@com_mysql_jdbc_outparam_13' for column '_NewID' at row 1

编辑: 这是存储过程的主体:

delimiter $$
CREATE PROCEDURE `AddPhysNode`(
    IN _a SMALLINT,IN _b BIGINT,IN _c BIT,IN _d VARCHAR(255),IN _e LONGBLOB,IN _f LONGBLOB,IN _g INT,IN _h SMALLINT,IN _i SMALLINT,IN _l SMALLINT,
    IN _m BIT,IN _n INT,IN _o BIGINT,INOUT _NewID INT,OUT _CreatedNew BIT
)
BEGIN       
IF (_NewID > 0) THEN
    UPDATE  tbl 
    SET     a = _a
    WHERE   Id = _NewID;

    SET _CreatedNew = 0;
ELSE
    INSERT INTO tbl (`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`l`,`m`,`n`,`o`)
    VALUES (_a,_b,_c,_d,_e,_f,_g,_h,_i,_l,_m,_n,_o);

    SET _CreatedNew = 1;
    SET _NewID = @@IDENTITY;
END IF;
END$$

关于此的任何提示?

非常感谢!

最佳

cghersi

1 个答案:

答案 0 :(得分:0)

这个问题似乎与并发问题有关,在多线程环境中,使用共享预准备语句导致执行此类语句,而另一个线程正在为该语句的参数分配新值。