Java 将当前行作为参数发送到Oracle DB触发器中的http请求
我使用下面的代码通过Oracle DB触发器在测试表上插入或更新时调用http调用Java 将当前行作为参数发送到Oracle DB触发器中的http请求,java,oracle,plsql,database-trigger,Java,Oracle,Plsql,Database Trigger,我使用下面的代码通过Oracle DB触发器在测试表上插入或更新时调用http调用 create or replace TRIGGER TEST_TABLE_TRIGGER AFTER INSERT OR UPDATE OF VALUE ON TEST_TABLE for each row DECLARE req utl_http.req; res utl_http.resp; url varchar2(100) := 'http://{serverIP}:8086/test
create or replace TRIGGER TEST_TABLE_TRIGGER
AFTER INSERT OR UPDATE OF VALUE ON TEST_TABLE
for each row
DECLARE
req utl_http.req;
res utl_http.resp;
url varchar2(100) := 'http://{serverIP}:8086/testMethod';
BEGIN
-- need to pass current row to the http method
req := utl_http.begin_request(url, 'GET',' HTTP/1.1');
utl_http.set_header(req, 'content-type', 'application/json');
res := utl_http.get_response(req);
utl_http.end_response(res);
END;
如何将新添加/更新的行作为参数传递给http请求?正在调用的Http请求是一个Java RESTful web服务,我将在其中处理新添加/更新的行。可以引用新行或更新行中的列,如触发器中的new.column\u name。您必须自己构建JSON负载,并将其放在标头中 如果您的REST服务停止,会发生什么情况?如果触发器抛出一个错误(如所写),事务将失败,更新将回滚。这是期望的结果吗
还要注意的是,即使它可以工作,在收到来自REST调用的响应之前,事务也不会完成,因此这种安排可能会给应用程序带来大量延迟(无论更新表是什么)。如果您不想要依赖性或延迟,您可能需要查看“pragma autonomobile\u transaction”调用。但是“pragma autonomobile\u transaction”引入了它自己的问题。如果事务插入/更新事务随后失败,则服务已收到成功通知。至少我认为这是一个成功的通知。正确。另外,无论哪种方式,如果同时修改了大量行,会发生什么情况?要么应用程序将锁定,等待每行触发一次触发器,要么REST接口可能会被太多的同时请求淹没。在大多数情况下,远程应用程序会在计时器上拉取数据,或者使用RESTAPI作为消息队列来触发拉取,而不是让数据库实时推送实际数据。这样,您就不会引入不必要的延迟、服务依赖性或处理未提交事务的风险,触发器或REST API可以限制处理的消息数量,以将数据提取限制在合理的数量。@pmdba如果REST服务关闭或触发器抛出错误,我们不希望insert/update回滚。你是说“pragma autonomy_transaction”会处理这个问题,还是我应该修改触发器来处理这个问题?而且db事务不应该等待RESTAPI响应。我们在这里使用的表每天最多有100次插入/更新。@VGH将数据从Oracle推送到REST接口作为事务的一部分(在触发器中)的问题是,如果REST调用失败,事务也会失败。您可以将REST调用分离到一个自治事务中,但这样您就有了触发器向REST发送数据的风险,而REST由于其他原因无法提交到数据库。最好让Java应用程序与数据库建立JDBC连接,定期轮询表以进行更新,或者使用REST接口通过消息触发此类轮询,而不是发送实际数据。