根据日期列更新数据库记录

Update database records based on date column

我正在开发一个应用程序,其中我在数据库中有一些实体,其中有一列表示该特定实体可用于某些操作之前的日期。当它过期时,我需要更改它的状态,这意味着更新代表它的状态的列。

到目前为止我在做什么,每当我向数据库请求这些实体对它们做某事时,我首先检查它们是否未过期,如果是,我更新它们。我不是特别喜欢这种方法,因为这意味着我将在数据库中拥有一堆处于错误状态的记录,只是因为我没有查询它们。另一种方法是让一个周期性任务运行这些记录并在必要时更新它们。我也不喜欢,因为我的记录会处于不一致的状态,在这种情况下,第一种方法似乎更合理。

还有其他方法吗,我错过了什么吗?我需要提一下,我的应用程序使用 spring-boot + hibernate。底层数据库是 Postgresql。我可以使用任何技术特定技巧来获得我想要的东西吗?

在数据库中没有触发器类型过期。如果你有一些过期的东西并且你应该做一些事情有两个解决方案(你已经写过):在你使用数据之前做一些额外的过期,和一些cron/task(它可能在数据库级别或在服务器端)。 我建议你使用 cron 方法。这是解释: 在获取数据之前对过期做一些事情:

更新于select

之前

+:您在需要之前更新过期数据,这里有问题 - 仅更新您请求的数据或所有已过期的数据...如果从所有记录中您只需要 2 条记录,则更新所有可能会消耗时间并更新了 2000 条与您的工作数据集无关的记录。

-: 更新所有记录的时间过长;如果数据库是共享的——不仅你的应用程序可以访问数据库,与过期相关的逻辑也不会被执行(如果你有这种情况);你需要控制入口点,你应该在什么地方处理过期的事情,什么地方不应该做;如果时间在 min 秒内过期 - 那么即使在执行过期逻辑之后,下一秒新记录也可能过期;此外,如果您需要更新过期数据处理的工作流逻辑,则需要将其保存在一个 plase 中 - 在 cron 中,在在你做之前更新的情况 select 你也应该更新更改的逻辑。

CRON/TASK

-:你应该花时间配置一次最多 30-60 分钟:); +:在后台执行;如果您的数据库不仅被您的应用程序使用,过期数据逻辑也可用;您不必检查(并且不必记住它,也不必为新员工解释......)在 select 之前的 java 代码中是否有任何过时的数据;您确实在关心过时数据和正常查询之间拆分逻辑。 您可以在 cron 中执行 'select for update',即使您在服务器端查询的更新时间内执行 select,您也将等待陈旧的数据逻辑完成,并且您会进入 select 最新数据

对于spring: spring scheduling documentation , simple example spring-quartz-schedule

用于数据库级别的 postgresql 作业调度程序

scheduler/cron 此类事情的最佳实践