gpt4 book ai didi

java - Java Servlet 中的 DBMS_ALERT 用法

转载 作者:行者123 更新时间:2023-11-30 04:14:28 25 4
gpt4 key购买 nike

我正在开发一个客户端/服务器应用程序,使用 Android 作为客户端,JBoss AS 7.x 作为服务器。我通过 servlet 完成所有这些工作,并且数据源配置为使用连接池。

要求之一是当数据源(Oracle)中的某些数据被删除时立即使客户端 session 无效。为此,我检查了 DBMS_ALERT。

据我所知,DBMS_ALERT 需要一个轮询机制,该机制将“挂起”应用程序,直到发生通知。所以我的 servlet 将停止所有操作并等待通知。如果我错了,请纠正我,因为我几乎没有 PL/SQL 经验。

我已经检查了此question中提供的资源但我没能理解什么是正确的道路。


DBMS_ALERT DataSource 端的代码是:

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 部分时挂起(如果它是可行的解决方案)?

谢谢

最佳答案

如果你看API documentation中的消息函数,它显示:

DBMS_ALERT.WAITONE (
name IN VARCHAR2,
message OUT VARCHAR2,
status OUT INTEGER,
timeout IN NUMBER DEFAULT MAXWAIT);

“超时”参数默认为永远。评论指出:

timeout

Maximum time to wait for an alert.

If the named alert does not occurs before timeout seconds, this returns a status of 1.

因此,您可以将此超时设置为几秒,然后循环轮询。然而,我认为这是一个糟糕的方法,因为您只是使用轮询来消耗网络和应用程序/服务器资源。如果可能的话,我会考虑使用 Oracle 高级队列,它允许完全异步处理(请参阅 DBMS_AQ 包)。

关于java - Java Servlet 中的 DBMS_ALERT 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com