【发布时间】:2009-12-18 14:42:46
【问题描述】:
我有一个用 PLJava 编写的程序,它通过 JMS 在我的 postgres 数据库中发送更新。
我想做的是在数据库内部(最好不是来自外部进程)中以间隔(每 15 秒)调用该函数。这可能吗?有什么想法吗?
【问题讨论】:
标签: sql database database-design postgresql stored-procedures
我有一个用 PLJava 编写的程序,它通过 JMS 在我的 postgres 数据库中发送更新。
我想做的是在数据库内部(最好不是来自外部进程)中以间隔(每 15 秒)调用该函数。这可能吗?有什么想法吗?
【问题讨论】:
标签: sql database database-design postgresql stored-procedures
如果您不需要外部访问,您可能可以修改数据库设计,以便根本不需要更新。你能详细解释一下更新的作用吗?
正如 depesz 所说,您可以使用 cron 或 pgAgent,但它们只能降低到一分钟的粒度,而不是 15 秒。考虑在存储过程中休眠直到下一次迭代不是一个好主意,因为您将一直有一个打开的事务,这是一个非常糟糕的主意。
【讨论】:
严格的回答:不可能。由于您不想要外部进程,并且 PostgreSQL 不支持作业 - 您不走运。
如果您要重新考虑使用外部进程,那么您很可能需要 cron 之类的东西,或者更好的 pgagent。
另一方面 - 你需要做什么,必须每 30 秒发生一次?这似乎是设计的问题。
【讨论】:
首先,如果您只是执行一项 cron 作业,您将花费最少的精力。
但是,如果您从头开始:您正尝试定期从数据库中复制行。我认为您正在查看复制队列。
PGQ 项目(用于 Londiste 复制,均来自 Skype 的 SkyTools)有一个可以独立使用的队列。当configuring it 时,您在生成批处理事件之前设置最大事件计数和循环延迟。通过这种方式,您可以获得不超过 15 秒的批次间隔。您现在必须使用调用pgq.insert_event 的触发器来生成将被批处理的事件;并消耗队列。消费者可以调用你的 PL/Java 存储过程;您必须重写该过程以批量发送所有内容,而不是扫描基表以查找新事件。
【讨论】:
听起来你在做某种复制?每 15 秒听起来像是很多更新。您能否设置一个触发器(或多个触发器)而不是轮询?
【讨论】:
如果您使用 JMS,为什么不让任务等待队列中的输入?
【讨论】:
根据您的 depesz 评论,您有一个 PL/Java 存储过程,它“将数据库表(更新)作为 Java 对象刷新”。由于您希望它以 15 秒的间隔运行,因此每次都必须处理一批更新。与其每 15 秒在存储过程中处理一批更新,不如通过更新后触发器一次处理一个更新,并消除对定时间隔的需要。如果您要聚合来自多个表的数据来构建对象,则只能将触发器添加到最上面的表中。
【讨论】:
在我的情况下,问题是代理无法授权到数据库,所以在我从 localhost 建立所有受信任的连接后,服务成功启动并且工作正常 有关错误的更多信息,您应该在基于 unix 的系统中查看 windows 事件查看器或 eq。查看我的配置文件C:\Program Files\PostgreSQL\10\data\pg_hba.conf
【讨论】: