【问题标题】:Call Web Service(asmx) from PostgreSql function every X hours每 X 小时从 PostgreSql 函数调用 Web Service(asmx)
【发布时间】:2014-09-14 19:57:56
【问题描述】:

我在 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;
$$;

我想在打印 NOTICE 的行中调用用 C#(asmx) 制作的 Web 服务。

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

【问题讨论】:

  • 从数据库函数调用 Web 服务的大多数情况都会导致性能问题,但我会照原样处理。使用像 plperl 或 plpython 这样的语言,你可以调用任何东西。弄清楚如何从命令行调用 Web 服务,并使用 perl 或 pythons 库之一使用 Web 服务调用进行系统调用,只有给定问题中的信息,你才能弄清楚。如果您真的想走这条路,或者您只是想看看是否可以阅读不受信任的 plperl(postgresql.org/docs/9.3/static/plperl-trusted.html)

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


【解决方案1】:

虽然可能从长期运行的函数中执行此操作,但出于多种原因,这是一个糟糕的想法。

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

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

  • 它浪费了一个非常好的 DB 连接 - 当 Web 服务调用发生时,DB 进程不能做任何有用的事情
  • 如果 Web 服务调用卡住,您可能会遇到大量卡住的数据库连接,从而导致严重的性能问题、连接池不足等

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

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


关于“每隔几个小时”位:不要尝试使用 DB 函数来执行此操作。由于函数的长时间运行的事务导致不可移动的行版本,它会导致性能问题。使用任务调度器/cron/pgagent/...

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多