我正在开发一个应用程序,我在数据库中有一些实体,其中有一列代表该特定实体可用于某些操作的日期。当它到期时,我需要改变它的状态,这意味着更新代表它的状态的列。
我到目前为止所做的事情,每当我要求数据库让这些实体对它们做某事时,我首先检查它们是否未过期,如果它们是,我会更新它们。我并不特别喜欢这种方法,因为这意味着我将在数据库中有一堆记录处于错误状态的记录,因为我还没有查询过它们。另一种方法是在这些记录上运行一个定期任务,并在必要时更新它们。我也不喜欢再说一次,我的记录会处于不一致状态,在这种情况下,第一种方法似乎更合理。
还有另一种方法吗,我错过了什么吗?我需要提一下,我使用spring-boot + hibernate作为我的应用程序。底层数据库是Postgresql。是否有任何技术特定的技巧可以用来获得我想要的东西?
答案 0 :(得分:1)
在数据库中没有triger类型过期。如果你有一些过期的东西,你应该做一些事情有两个解决方案(你已经写过了):在使用数据之前做一些额外的过期,以及一些cron / task(它可能在db级别或服务器上)侧)。 我建议你使用cron方法。这是解释: 在获取数据之前做一些过期的事情:
在选择
之前更新+:您需要之前更新过期数据,这里有问题 - 仅更新您请求的或所有过期的...更新全部可能是时间消耗,如果从所有记录中您只需要2条记录并更新与您工作数据集无关的2000条记录。
- :很长时间更新所有记录;如果数据库是共享的 - 访问db不仅会使你的应用程序失败,也不会执行与expired相关的逻辑(如果你有这种情况);你需要控制入口点你应该做什么过期和你不应该做的事情;如果时间以min,sec过期 - 那么即使你执行了过期的逻辑,在下一秒,新记录也可能过期;如果你需要更新工作流逻辑来过期数据处理,你需要将它保存在一个cse中 - 在cron中,在选择之前进行更新的情况下,您也应该更新已更改的逻辑。
<强> CRON / TASK 强>
- :你应该花时间配置一次最多30-60分钟:); +:它在后台执行;如果你的数据库不仅被你的应用程序使用,那么过期的数据逻辑也是可用的;你不必检查(并且不要记住它,并解释新员工的问题......)在选择某些东西之前,你的java代码中是否有任何staled数据;你在关心staled数据和普通查询db之间分裂逻辑。 您可以在cron中执行'select for update',即使您在服务器端查询的更新时间内选择,您也将等待数据逻辑完成并获得选择的最新数据
春天: spring scheduling documentation,simple example spring-quartz-schedule
用于db level postgresql作业调度程序
scheduler / cron这是这类事情的最佳实践