数据库作业调度

时间:2009-12-18 14:42:47

标签: sql database database-design postgresql stored-procedures

我有一个用PLJava编写的程序,它在我的postgres数据库中通过JMS发送更新。

我想要做的是在数据库内部(每15秒)调用一次该函数(最好不要来自外部进程)。这可能吗?有什么想法吗?

8 个答案:

答案 0 :(得分:2)

严格的回答:这是不可能的。由于你不需要外部流程,而且PostgreSQL不支持工作 - 你运气不好。

如果你重新考虑使用外部流程,那么你很可能想要像cron这样的东西,或者更好的是pgagent。

另一方面 - 你需要做什么才能每30秒发生一次?这似乎是一个设计问题。

答案 1 :(得分:2)

如果您不需要外部访问,则可能会修改数据库设计,因此您根本不需要更新。你能解释一下更新正在做什么吗?

正如depesz所说,你可以使用cron或pgAgent,但它们只能达到一分钟的粒度,而不是15秒。考虑在存储过程中休眠,直到下一次迭代不是一个好主意,因为你将在那个时间有一个开放的事务,这是一个非常糟糕的主意。

答案 2 :(得分:2)

首先,如果你只是去做一个cron工作,你将花费最少的努力。

但是,如果您从scracth开始:您正在尝试定期从数据库中复制行。我想你正在看一个复制队列。

PGQ项目(用于Londiste复制,均来自Skype的SkyTools)有一个可以独立使用的队列。在configuring it时,您可以在生成批处理事件之前设置最大事件计数和循环延迟。您可以通过这种方式获得间隔不超过15秒的批次。您现在必须使用调用pgq.insert_event的触发器生成将要批处理的事件;并消耗队列。消费者可以调用您的PL / Java存储过程;你必须重写程序以发送批处理中的所有内容,而不是扫描基表以获取新事件。

答案 3 :(得分:1)

据我所知,postgresql不支持计划任务。您需要使用cronat的脚本(取决于您的操作系统。)

答案 4 :(得分:0)

听起来你在做复制吗?每15个听起来像很多更新。您可以设置触发器(或多个触发器)而不是轮询吗?

答案 5 :(得分:0)

如果您正在使用JMS,为什么不让任务等待队列上的输入?

答案 6 :(得分:0)

根据您的 depesz 注释,您有一个PL / Java存储过程“将数据库表(更新)刷新为java对象”。由于您希望它以15秒的间隔运行,因此每次都必须处理一批更新。不是每15秒处理一次存储过程中的一批更新,为什么不通过更新后触发器一次处理一个更新,并且不需要定时间隔。如果要聚合来自多个表的数据来构建对象,而不是仅将触发器添加到最上面的表中。

答案 7 :(得分:0)

在我的情况下,问题是代理无法授权数据库,因此在我使所有连接均受本地主机信任后,服务成功启动并且工作正常 有关错误的更多信息,您应该在基于unix的系统中查看Windows事件查看器或eq。看到我的配置文件C:\Program Files\PostgreSQL\10\data\pg_hba.conf