每分钟检查数据库和执行操作的最佳方法?

时间:2018-07-17 06:54:50

标签: java sql-server

我有一个电子商务应用程序。我有一个Item实体,并且只要该项目的结束日期时间等于当前时间,该项目的状态就应该改变(我还需要执行其他SQL操作,例如在表中插入一行)

基本上,我想执行一个SQL操作,该操作每分钟检查一次数据库并更改实体。

我对如何实现这一点有一些想法:

  • 安排我的linux服务器中的作业,每分钟检查一次数据库
  • 使用sp_executesql(Transact-SQL)或DBMS Scheduler
  • 在Java后端中运行一个线程来检查db并执行操作。

我对此很陌生,所以我不知道如何实现它。考虑到可伸缩性性能的最有效的实现是什么?

其他信息:数据库是SQL Server,服务器是Linux,后端是Java Spring Boot。

1 个答案:

答案 0 :(得分:1)

如果您需要在插入或更新之后运行脚本,则可以在触发器中整合所有复杂的逻辑(例如,在其他表中插入行,更新状态列等):

这是一个示例表架构:

CREATE TABLE t1 (id INT IDENTITY(1,1), start_time DATETIME, end_time DATETIME, 
    status VARCHAR(25))

以及该表的示例插入/更新触发器:

CREATE TRIGGER u_t1 
ON t1
AFTER INSERT,UPDATE
AS
BEGIN
    UPDATE t1
    SET status = CASE WHEN inserted.end_time = inserted.start_time 
        THEN 'same' ELSE 'different' END 
    FROM t1 
    INNER JOIN inserted ON t1.id = inserted.id

    -- do anything else you want!
    -- e.g. 
    -- INSERT INTO t2 (id, status) SELECT id, status FROM inserted
END
GO

插入一些测试记录:

INSERT INTO t1 (start_time, end_time) 
VALUES 
    (GETDATE(), GETDATE() - 1), -- different
    (GETDATE(), GETDATE())      -- same

在插入后查询表:

SELECT * FROM t1

请确保状态计算正确:

id  start_time              end_time                status
1   2018-07-17 02:53:24.577 2018-07-16 02:53:24.577 different
2   2018-07-17 02:53:24.577 2018-07-17 02:53:24.577 same

如果您的唯一目标是根据表中的其他值更新状态列,那么计算列是最简单的方法;您只需提供公式即可:

create table t1 (id int identity(1,1), start_time datetime, end_time datetime, 
status as 
    case 
        when start_time is null then 'start null' 
        when end_time is null then 'end null' 
        when start_time < end_time then 'start less' 
        when end_time < start_time then 'end less' 
        when start_time = end_time then 'same' 
        else 'what?' 
    end
)