大家好,我有这样一个需求,不知道能否实现呢!
我表里有这样一些数据,它们是有过期时间的。
而我呢,有这样一个需求,就是在“还有10秒”过期时,我要做一些事情的。
而我又是做web开发的,如果没有用户打开网站页面,就不可以检查到还有10秒就要过期了,我没办法去触发。
在sqlserver中我该怎么做呢。请高手们指点!

解决方案 »

  1.   

    关键是你要做什么事情呢?你可以写一个windows程序放在服务器上,每隔几秒做些事情
      

  2.   

    我第一感觉想到的方法是建立一个JOB,定时做数据Check
    但如果LZ的数据量过大的话,势必会影响服务器的性能..
    所以,访问量,数据量等等方面的东西能说清楚一点就好了.
      

  3.   

    数据库本身可以有个维护计划的貌似那里面可以做一个类似于job的东东。
      

  4.   

    我也接受过建议用 windows 程序来做,现在大家的方案基本上是 sql server 的作业来解决此问题。
    说实话,我以前没做过这东西,而客户要求高,要求必须 信息还有10秒过期时,对信息进行处理。如果用sqlserver作业来做,必须1秒钟检查一次,虽然客户有自己的服务器,不过我NND的心理就是不踏实,做立不安,这不是开玩笑吗?这么能做吗?
      

  5.   

    这种用job来做,但1秒就搞一次估计不可行,除非服务器硬件太好,能经得起折腾
      

  6.   

    也可以创建一个每分钟执行的作业,写上类似下面的处理,设置作业调度每分钟执行,就可以实现每秒执行的效果  
       
      declare   @i   int  
      set   @i=0  
      while   @i<60  
      begin  
            exec   你每秒要做的处理(封装成存储过程,方便调用)  
            waitfor   delay   '00:00:01'     --延时1秒  
            set   @i=@i+1  
      end-----------------------------------------------------------------------------------------------------
    我想知道,这么写将会有什么后果
      

  7.   

    不要在数据库端用 job,也不要在前端程序用timer存放在表里的数据10s失效, 那么不一定要定时去删除或update记录状态(job,timer,windowservice定时等 都属于这种方式)这是一种设计上的问题,不是技术问题。10s的job数据量大怎么跑?
    这类数据,要记录它的生命开始时间,即要有datateime列记录logDatetime,然后再增加计算列timeSpan int,计算当前时间与logDatetime的差值,并建立索引.没人触发你的web page时,数据当然不会变化,从数据值上来看,也看不出失效。但在你的操作中,加上认为其是失效的代码。
    比如 where timeSpan < 10不合这个条件的就是无效数据。 不一定要更新状态或者删除这样的记录。然后,job定期比如2小时,删除这样的无效记录,或更新状态, 这样整体与细节的配合,使得设计得当。
      

  8.   

    建立一张表a,里面保存能判断唯一事件的条件以及过期时间
    对过期时间加索引
    启动一个作业,每秒执行,检查当前时间与过期时间差值小于等于10S的记录,将这些记录插入到另一张表b里,然后删除a里的这些数据
    对b里的记录做你需要的操作,然后删除
      

  9.   

    八水绕长安 兄,太谢谢你用心解决我的问题了。可是我要实现的功能不是这样的问题。
    我想实现的不是删除,或,在WEB视图中显示有效数据的问题。
    我可以确认,我要实现的功能,是实时的。必须知道是“哪条”数据,还将在10秒钟后失效,而我必须要做些事。在数据库上我想也只有做业可以这么干了。
    我能不利用别的程序来操作数据库,达到1秒钟一次,我朋友说用VB开发个windows程序,在服务器端运行。来负责这事务。有没有理好的办法。
      

  10.   


    CREATE TABLE [dbo].[time1]([shijian] [datetime] NOT NULL)
      declare  @i  int  
      set  @i=0  
      while  @i <60  
      begin  
            insert into dbo.time1 select getdate()
            waitfor  delay  '00:00:01'    --延时1秒  
            set  @i=@i+1  
      end select * from time1执行正常,在1分钟内select可以得到最新的记录,cpu也是正常的
      

  11.   

    既然可以用
      declare  @i  int  
      set  @i=0  
      while  @i <60  
      begin  
            insert into dbo.time1 select getdate()
            waitfor  delay  '00:00:01'    --延时1秒  
            set  @i=@i+1  
      end 的方法来每秒插入一条记录,就可以利用触发器来完成后面的操作了吧。对触发器不是很熟悉了
      

  12.   

    做一个作业,也就是job,每10秒做一次检查表中添加一字段,表示是否已经过期用户打开web就提示显示标识已经过期的数据,然后后台处理
      

  13.   

    又希望达到秒级的实时,又希望较好的性能,
    两者权衡,可参考如下的方案:1.数据库建一job,每日0点运行,选出1日内将要到期的数据,插入候选表
    2.页面建一个timer,每秒检测候选表的数据。
    3.用户加载页面时,判断:如果候选表为空,则不调用timer,否则启动timer。
    4.timer侦测到有数据在10s之内,提示做某些事情,并将该数据从候选表中删除。
      

  14.   

    恩,不错的主义~GOOD IDEA不过呢,问题的最关键点,是当有到期数据谁来触发“程序【就是我要做的一些事情】”,要求在没有人访问WEB页面时也要进行程序操作。
      

  15.   


    要求在没有人访问WEB页面时也要进行程序操作。
    那就要抛开WEB页面,也就是说纯用数据库作业实现,只要你的数据表数据不多,每10秒执行下检查(实际是个查询)对性能影响不会很大,必要时可以加必要的索引提高性能