每隔X小时从PostgreSql函数调用Web Service(asmx)

本文关键字:Service asmx Web 函数调用 小时 PostgreSql 每隔 | 更新日期: 2023-09-27 18:14:18

我在PostgreSql中得到了一个函数:

do $$
  declare
    arow record;
    foo varchar(50);
  begin
    for arow in
      select name from person s(a)
    loop
      foo := arow.name;
      RAISE NOTICE 'Calling asmx(%)', foo;
    end loop;
  end;
$$;

我想调用一个用c#制作的Web服务(asmx),在我打印通知的那一行。

有可能吗?如果没有,有什么建议吗?

每隔X小时从PostgreSql函数调用Web Service(asmx)

虽然可以从一个长时间运行的函数中做到这一点,但由于许多原因,这是一个糟糕的想法。

相反,您应该在通道上NOTIFY,然后让LISTEN客户端守护进程接收通知并调用web服务。

这本质上与"如何从函数/触发器发送电子邮件"是相同的问题,具有所有相同的问题,如:

  • 它浪费了一个完美的DB连接-当web服务调用发生时,DB进程不能做任何有用的事情
  • 如果web服务调用卡住了,你可能会遇到很多卡住的DB连接,导致严重的性能问题,连接池耗尽等

如果您决定必须直接从函数调用web服务,则需要使用PL/Perl, PL/python, PL/TCL, PL/Java或实现C函数来进行调用。你不能直接在PL/PgSQL中这样做,因为它没有TCP/IP, HTTP等支持(设计;它意味着包含在数据库内的操作中,并受到数据库安全模型的限制)。您的Pl/PgSQL函数可以调用另一种语言的函数。从该语言调用web服务就像从该语言的任何其他函数调用它一样(除了你不能使用线程)。

请不要这样做。使用LISTENNOTIFY。这就是他们存在的意义。


关于"每隔几个小时"的部分:不要尝试在DB函数中这样做。这将导致性能问题,因为不可移动的行版本是由函数长时间运行的事务引起的。使用任务调度程序/cron/pgagent/…