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

时间:2014-07-23 14:50:09

标签: c# web-services postgresql asmx postgresql-9.3

我在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#(asmx)中调用一个Web服务,在我打印NOTICE的行中。

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

1 个答案:

答案 0 :(得分:2)

虽然可能从长时间运行的功能中执行此操作,但出于多种原因,这是一个可怕的想法。

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

这与"how do I send an email from a function/trigger"基本上是同一个问题,存在所有相同的问题,例如:

  • 它浪费了一个非常好的数据库连接 - 当Web服务调用发生时,数据库进程无能为力
  • 如果Web服务调用卡住,您可能会遇到大量卡住的数据库连接,从而导致严重的性能问题,连接池耗尽等等。

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

但请不要。使用LISTENNOTIFY。这就是他们的目的。


重新“每隔几个小时”位:不要尝试使用数据库功能。由于函数的长时间运行事务导致不可移动的行版本,这会导致性能问题。使用task scheduler / cron / pgagent / ...