Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将当前行作为参数发送到Oracle DB触发器中的http请求_Java_Oracle_Plsql_Database Trigger - Fatal编程技术网

Java 将当前行作为参数发送到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

我使用下面的代码通过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/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接口通过消息触发此类轮询,而不是发送实际数据。