在JAVA端使Oracle存储过程串行地执行 - 编程入门网
v_lockhandle, i_expiration_time);
v_result := dbms_lock.request(v_lockhandle, dbms_lock.x_mode, i_wait_time, true);
select sys_context(''USERENV'',''SID'') into v_sid from dual;
dbms_output.put_line (to_char(systimestamp,''HH24:MI:SS.FF3'')||'': SID ''||v_sid||'' requests lock'');
if v_result <> 0 then
dbms_output.put_line(
case
when v_result=1 then ''Timeout''
when v_result=2 then ''Deadlock''
when v_result=3 then ''Parameter Error''
when v_result=4 then ''Already owned''
when v_result=5 then ''Illegal Lock Handle''
end);
else
app_task_wrapper_proc(i_procname);
end if;
commit;
return v_result;
EXCEPTION
WHEN OTHERS
THEN
/**//*
|| Anonymous block inside the exception handler lets me declare
|| local variables to hold the error code information.
*/
DECLARE
error_code NUMBER := SQLCODE;
error_msg VARCHAR2 (300) := SQLERRM;
BEGIN
DBMS_OUTPUT.put_line(error_code || '': '' ||error_msg);
--RE RAISE ERROR TO CLIENT
raise;
END; -- End of anonymous block.
end frm_test_task_func;
end frm_test_task_pkg;
在JAVA端使Oracle存储过程串行地执行(3)时间:2011-07-28在java端,应用程序只需要调用frm_test_task_func,把需要串行化的存储过程作为参数传入。Java端还需要提供db锁的逻辑名,这样同步在相同的逻辑名的锁上的存储过程会同步执行。在实际存储过程参数比较复杂的情况下,传参可能是个问题。 其实还有一种方法,对已有的存储过程代码没有侵入性,申请和释放db锁在java端完成,oracle保证了session断掉后,会释放session占有的锁资源。所以如果应用服务器down掉后,session在经过一段时间后会被释放,锁资源也会被释放。现在要考虑的是是否在事务结束的时候自动释放锁,考虑到现在申请锁是由java端完成的,所以释放锁也由java端显式的调用release释放。
这样java端需要先调用frm_test_lock_acquire申请锁,然后执行用户逻辑的存储过程,最后在显式的调用frm_test_lock_release释放锁。如果不想每次用到的时候都 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |