【问题标题】:Database Job Scheduling数据库作业调度
【发布时间】:2009-12-18 14:42:46
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您不需要外部访问,您可能可以修改数据库设计,以便根本不需要更新。你能详细解释一下更新的作用吗?

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

    【讨论】:

    • 你可以每 15 秒用 cron 做一些事情,方法是每分钟运行一个作业,这将 (dosomething: sleep 15; dosomething: sleep 15; dosomething: sleep 15;)
    【解决方案2】:

    严格的回答:不可能。由于您不想要外部进程,并且 PostgreSQL 不支持作业 - 您不走运。

    如果您要重新考虑使用外部进程,那么您很可能需要 cron 之类的东西,或者更好的 pgagent。

    另一方面 - 你需要做什么,必须每 30 秒发生一次?这似乎是设计的问题。

    【讨论】:

    • 我每 15 秒使用 PL/Java 编写的存储过程将数据库表(更新)作为 Java 对象刷新
    【解决方案3】:

    首先,如果您只是执行一项 cron 作业,您将花费最少的精力。

    但是,如果您从头开始:您正尝试定期从数据库中复制行。我认为您正在查看复制队列。

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

    【讨论】:

    • “除了已经完成的工作之外,几乎没有什么工作”,这样更好吗?
    • “你不需要做很多工作,如果你只做一个 cron 工作”
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      听起来你在做某种复制?每 15 秒听起来像是很多更新。您能否设置一个触发器(或多个触发器)而不是轮询?

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • 欢迎来到 SO!请编辑并澄清一下您在做什么。此外,配置文件作为文本而不是屏幕截图将不胜感激。事实上,你的答案看起来很仓促。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-02-18
            • 1970-01-01
            • 1970-01-01
            • 2023-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多