我正在开发使用 Android 作为客户端和 JBoss AS 7.x 作为服务器的客户端/服务器应用程序。我通过一个 servlet 完成所有这些工作,并且 DataSource 被配置为使用连接池。
要求之一是在删除 DataSource(Oracle) 中的某些数据时立即使客户端会话无效。为此,我正在检查 DBMS_ALERT。
据我所知,DBMS_ALERT 需要一种轮询机制,该机制将“挂起”应用程序,直到发生通知。所以我的 servlet 将停止所有操作并等待通知。如果我错了,请纠正我,因为我对 PL/SQL 几乎没有经验。
我已经检查了这个问题中提供的资源,但我不明白什么是正确的做法。
DBMS_ALERT数据源端的代码是:
CREATE OR REPLACE TRIGGER apps0000_datuser_biur
BEFORE INSERT OR UPDATE OR DELETE on apps0000_t
REFERENCING NEW AS NEW OLD AS OLD
for EACH ROW
begin
if (deleting) then
DBMS_ALERT.signal('appdelete',:old.APPS_PACKAGE);
end if;
end;
DBMS_ALERT servlet端的代码是(如果我在这里有问题,请纠正我):
try {
String strDSName1 = "java:/OracleDSJNDI";
ctx = new InitialContext();
ds1 = (javax.sql.DataSource) ctx.lookup(strDSName1);
} catch (Exception e) {
System.out.println("ERROR getting 1'st DS : " + e);
}
conn = ds1.getConnection();
String sql = null;
String message = null;
String status = null;
sql = "{call dbms_alert.register('appdelete')}";
CallableStatement cs1 = conn.prepareCall(sql);
cs1.execute();
sql = "{call dbms_alert.waitone('appdelete', ?, ?, ?)}";
CallableStatement cs2 = conn.prepareCall(sql);
cs2.registerOutParameter(1, Types.VARCHAR);
cs2.registerOutParameter(2, Types.VARCHAR);
cs2.registerOutParameter(3, Types.VARCHAR);
int x = 0;
while (x == 0) {
cs2.execute();
String Result = cs2.getString(1);
System.out.print(Result + "\n");
}
我的问题是:如何在我的 servlet 中实现它而不导致它在到达 DBMS_ALERT 部分时挂起(如果它是一个可行的解决方案)?
谢谢