如何使用程序终止从 java 代码调用它的作业?
How to use procedure to kill jobs calling it from java code?
我想通过调用下面的过程并传递作业 ID、会话 ID 和会话序列号等参数,从 java 应用程序中终止一些作业。它不会工作,我在这里很迷路。
PROCEDURE kill_batch_test (
V_JOB IN VARCHAR2,
V_SID IN VARCHAR2,
V_SERIAL IN VARCHAR2 )
IS
BEGIN
DBMS_JOB.REMOVE(V_JOB);
execute immediate 'Alter System Kill Session '''|| to_char (V_SID) || ',' || to_char (V_SERIAL) || ''' IMMEDIATE';
EXCEPTION
WHEN OTHERS THEN
RETURN;
END;
[编辑]
java代码:
这让我得到了用户工作:
String sql1 = "select sid SID, username, serial# SERIAL,j.job JOB, WHAT from (select dj.LOG_USER, dj.JOB, dj.BROKEN, dj.FAILURES, dj.LAST_DATE,dj.LAST_SEC, dj.THIS_DATE, dj.THIS_SEC, dj.NEXT_DATE, dj.NEXT_SEC, dj.INTERVAL, dj.WHAT from dba_jobs dj ) j,(select p.spid, s.username, s.sid, s.serial# from v$process p, v$session s where p.addr = s.paddr AND s.username = 'EPS') s ";
SQLQuery res = (SQLQuery) session.createSQLQuery(sql1).setCacheable(false);
res.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List e = res.list();
Object o;
Iterator it = e.iterator();
for(int i=0;i<e.size();i++){
o = it.next();
Map m = (Map)o;
String sid = null;
String serial = null;
String job = null;
sid = m.get("SID").toString();
serial = m.get("SERIAL").toString();
job = m.get("JOB").toString();
这里我调用程序:
CallableStatement storedProc = hibConnection.prepareCall(sql);
storedProc.setString(1,job);
storedProc.setString(2,sid);
storedProc.setString(3,serial);
storedProc.executeUpdate();
}
首先,正如评论中所指出的,您程序的 EXCEPTION WHEN OTHERS THEN RETURN
部分确实对您没有帮助。要阻止它吞噬异常,只需将其删除。
要修复随后出现的 'insufficient privileges' 错误,请以具有适当特权的用户身份连接到您的数据库并 运行 GRANT ALTER SYSTEM TO <user your Java app connects as>
。请谨慎使用此权限,因为您的用户现在有权使用许多其他可能的 ALTER SYSTEM
语句 运行.
最后(您可能已经意识到这一点),考虑从 DBMS_JOB
移动到 DBMS_SCHEDULER
。特别是,后者有一种更强大的停止作业的方法,而无需您使用的强制方法,该方法涉及查找用于 运行 作业的会话并终止该会话。
我想通过调用下面的过程并传递作业 ID、会话 ID 和会话序列号等参数,从 java 应用程序中终止一些作业。它不会工作,我在这里很迷路。
PROCEDURE kill_batch_test (
V_JOB IN VARCHAR2,
V_SID IN VARCHAR2,
V_SERIAL IN VARCHAR2 )
IS
BEGIN
DBMS_JOB.REMOVE(V_JOB);
execute immediate 'Alter System Kill Session '''|| to_char (V_SID) || ',' || to_char (V_SERIAL) || ''' IMMEDIATE';
EXCEPTION
WHEN OTHERS THEN
RETURN;
END;
[编辑]
java代码: 这让我得到了用户工作:
String sql1 = "select sid SID, username, serial# SERIAL,j.job JOB, WHAT from (select dj.LOG_USER, dj.JOB, dj.BROKEN, dj.FAILURES, dj.LAST_DATE,dj.LAST_SEC, dj.THIS_DATE, dj.THIS_SEC, dj.NEXT_DATE, dj.NEXT_SEC, dj.INTERVAL, dj.WHAT from dba_jobs dj ) j,(select p.spid, s.username, s.sid, s.serial# from v$process p, v$session s where p.addr = s.paddr AND s.username = 'EPS') s ";
SQLQuery res = (SQLQuery) session.createSQLQuery(sql1).setCacheable(false);
res.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List e = res.list();
Object o;
Iterator it = e.iterator();
for(int i=0;i<e.size();i++){
o = it.next();
Map m = (Map)o;
String sid = null;
String serial = null;
String job = null;
sid = m.get("SID").toString();
serial = m.get("SERIAL").toString();
job = m.get("JOB").toString();
这里我调用程序:
CallableStatement storedProc = hibConnection.prepareCall(sql);
storedProc.setString(1,job);
storedProc.setString(2,sid);
storedProc.setString(3,serial);
storedProc.executeUpdate();
}
首先,正如评论中所指出的,您程序的 EXCEPTION WHEN OTHERS THEN RETURN
部分确实对您没有帮助。要阻止它吞噬异常,只需将其删除。
要修复随后出现的 'insufficient privileges' 错误,请以具有适当特权的用户身份连接到您的数据库并 运行 GRANT ALTER SYSTEM TO <user your Java app connects as>
。请谨慎使用此权限,因为您的用户现在有权使用许多其他可能的 ALTER SYSTEM
语句 运行.
最后(您可能已经意识到这一点),考虑从 DBMS_JOB
移动到 DBMS_SCHEDULER
。特别是,后者有一种更强大的停止作业的方法,而无需您使用的强制方法,该方法涉及查找用于 运行 作业的会话并终止该会话。