每隔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),在我打印通知的那一行。
有可能吗?如果没有,有什么建议吗?
虽然可以从一个长时间运行的函数中做到这一点,但由于许多原因,这是一个糟糕的想法。
相反,您应该在通道上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服务就像从该语言的任何其他函数调用它一样(除了你不能使用线程)。
请不要这样做。使用LISTEN
和NOTIFY
。这就是他们存在的意义。
关于"每隔几个小时"的部分:不要尝试在DB函数中这样做。这将导致性能问题,因为不可移动的行版本是由函数长时间运行的事务引起的。使用任务调度程序/cron/pgagent/…