Java Mysql函数不返回对Hibernate的响应
我有一个mysql函数,它是使用Spring的HibernateCallback类从web应用程序的服务类调用的。此函数使用光标选择一些行,然后执行一些更新和插入操作。然后返回一个varchar 当光标选择的行数为几百行时,一切正常。但当行数为12000时,调用的java代码没有收到任何响应,即使是在1小时内 当我们查看mysql慢速查询日志和错误日志时,显示mysql函数运行时间为8秒,锁定时间为0.7秒。但java程序并没有得到任何响应。而且,无论何时调用此函数,mysql进程列表都会非常高 当根据mysql日志,函数已经运行时,没有响应的可能原因是什么 功能如下:Java Mysql函数不返回对Hibernate的响应,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我有一个mysql函数,它是使用Spring的HibernateCallback类从web应用程序的服务类调用的。此函数使用光标选择一些行,然后执行一些更新和插入操作。然后返回一个varchar 当光标选择的行数为几百行时,一切正常。但当行数为12000时,调用的java代码没有收到任何响应,即使是在1小时内 当我们查看mysql慢速查询日志和错误日志时,显示mysql函数运行时间为8秒,锁定时间为0.7秒。但java程序并没有得到任何响应。而且,无论何时调用此函数,mysql进程列表都会非常高
CREATE FUNCTION fun_test(
param1 varchar(15),
param2 varchar(20),
v_startTime timestamp,
v_endTime timestamp)
RETURNS varchar(50) DETERMINISTIC
begin
declare v_no_more_rows BOOLEAN;
declare v_id int ;
declare v_count int default 0;
declare v_amount double ;
declare v_totalAmount double default 0;
DECLARE cur1 CURSOR FOR
SELECT id,amount
from table1
where col1=param1
and updatedat>= v_startTime
and updatedat< v_endTime
and amount>0;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET v_no_more_rows = TRUE;
OPEN cur1;
loop_cur1: LOOP
FETCH cur1
INTO v_id,v_amount;
IF v_no_more_rows THEN
CLOSE cur1;
LEAVE loop_cur1;
END IF;
insert into table2 (parentid,createdAt) values(v_id,current_timestamp());
update table1
set updatedat = current_timestamp()
where
id = v_id;
set v_totalAmount=v_totalAmount+v_amount;
set v_count=v_count+1;
END LOOP loop_cur1;
return concat("SUCCESS:",v_totalAmount,":",v_count);
end ;
你能发布显示函数完成的日志条目吗?mysql进程CPU使用率是否非常高,持续时间是否为7秒或更长?在查看Hibernate/您的Java代码之前,最好“证明”您的理论,即函数正在完成,因为您看到的一个明显的解释是函数实际上没有完成。请检查您的Hibernate会话。如果表在hibernate会话中被锁定,而您正试图通过游标插入到同一个表中,则可能会出现此问题。@KanagarajM如果在游标插入中出现问题,mysql函数是如何在7秒内完成的?我知道这应该是下一个问题,但我已经遇到了此类问题。只有在这种情况下,Hibernate才会等待太长时间。尝试调试并发布您的hibernate日志。@KanagarajM:由于函数对调用java代码没有响应,我将在java或hibernate中调试什么?
Time: 140116 11:22:39
User@Host: host @ [x.x.x.x]
Query_time: 7.868044 Lock_time: 0.852301 Rows_sent: 1 Rows_examined: 0
SET timestamp=1389851559;
select fun_test('a','b','2014-01-01 11:00:00','2014-01-01 12:00:00');