相关文章
更多最近更新
更多WEB系统数据库字段在一段时间后自动修改的问题(SSH)
2019-03-25 13:38|来源: 网路
现在有一个类似工作流的系统,但是没有使用jbpm框架,SSH2开发环境。
问题是这样的:
有一个请求request(id,status),某角色的用户将次数据库中存放的某一id的request的status修改为某一个值时,比如open,则从修改时开始计时,若没有其他用户将它的状态改为其他值,那么24小时后,要让此request的status字段自动变为另一个值,并不让任何用户再修改。
请问如何实现?
我的一个思路是在status被修改成open时,启动一个线程开始计时,若有人修改了它,则取消计时,若没有人修改,那么24小时后修改它。
有没有哪位高人有更好的实现方法。先谢过了!
问题补充:
我看了一下spring的定时任务,那这个触发器怎么写呢?
因为考虑如果状态被更改的话,这个任务就要取消了。请指教。
问题补充:
先谢谢了,这个项目不能使用其他框架了,若像楼上所说,用spring的任务调度怎么解决呢?
问题补充:
确定的是24小时的时间间隔,而且状态能被主动改变,能详细说明实现方式吗?
另外,使用的数据库是mysql5.0,这个版本的mysql似乎没有任务调度。
问题补充:
首先谢谢你的回答,但是我还是有疑问:
1、当记录产生比较多的时候,线程就会很多,这不是很浪费资源和影响性能吗?
2、而且考虑下面一种情况:
假如记录r的status被A从start修改为open,此时一个线程t1启动,并准备在24小时后将其status修改为close;可是假如在此期间,A又将其状态改为start,并在线程t1的24小时计时内又将状态改为open,此时又一线程t2启动,并开始计时24小时并修改为close,可是此时线程t1并不知情,他还是会去修改,可是此时t1的计时已经无意义了,t2的计时才有意义,这种情况如何处理呢??
问题补充:
谢谢回答。
经过您和各位的提示,您看我这样设计合不合适:
在系统启动时,查询记录中所有状态为close的记录,并用一个Map保存每个记录的ID和open的时间,并在系统启动时用一个线程定时(如5分钟)扫描这个Map,如果记录的时间和系统时间差大于24小时,就修改状态为close。在系统运行中,每次修改记录状态时,如果改成start就同时将其ID从Map中移除(如果有的话),如果改成close,就将其加到Map中。
您觉得这样做可不可行,有什么缺点吗?
问题是这样的:
有一个请求request(id,status),某角色的用户将次数据库中存放的某一id的request的status修改为某一个值时,比如open,则从修改时开始计时,若没有其他用户将它的状态改为其他值,那么24小时后,要让此request的status字段自动变为另一个值,并不让任何用户再修改。
请问如何实现?
我的一个思路是在status被修改成open时,启动一个线程开始计时,若有人修改了它,则取消计时,若没有人修改,那么24小时后修改它。
有没有哪位高人有更好的实现方法。先谢过了!
问题补充:
xutao5641745 写道
我推荐用 Spring定时任务。。。。
我看了一下spring的定时任务,那这个触发器怎么写呢?
因为考虑如果状态被更改的话,这个任务就要取消了。请指教。
问题补充:
xutao5641745 写道
那建议你用 任务调度框架Quartz,可定制性强多了
任务调度框架Quartz文档
http://blog.csdn.net/alex197963/archive/2009/08/06/4417995.aspx
任务调度框架Quartz文档
http://blog.csdn.net/alex197963/archive/2009/08/06/4417995.aspx
先谢谢了,这个项目不能使用其他框架了,若像楼上所说,用spring的任务调度怎么解决呢?
问题补充:
jansonzhan 写道
1、可以通过程序中的任务调度(如Quartz),进行定时去扫描符合条件的进行修改
2、可以使用数据库的任务调度(如oracle的job),进行定时去扫描符合条件的进行修改
2、可以使用数据库的任务调度(如oracle的job),进行定时去扫描符合条件的进行修改
确定的是24小时的时间间隔,而且状态能被主动改变,能详细说明实现方式吗?
另外,使用的数据库是mysql5.0,这个版本的mysql似乎没有任务调度。
问题补充:
jiangnan2112 写道
个人觉得你还线程好些,如果时间要求很准的话要任务调度要执行的频率太高,不高的话时间不好把握,不划算!
首先谢谢你的回答,但是我还是有疑问:
1、当记录产生比较多的时候,线程就会很多,这不是很浪费资源和影响性能吗?
2、而且考虑下面一种情况:
假如记录r的status被A从start修改为open,此时一个线程t1启动,并准备在24小时后将其status修改为close;可是假如在此期间,A又将其状态改为start,并在线程t1的24小时计时内又将状态改为open,此时又一线程t2启动,并开始计时24小时并修改为close,可是此时线程t1并不知情,他还是会去修改,可是此时t1的计时已经无意义了,t2的计时才有意义,这种情况如何处理呢??
问题补充:
7454103 写道
具体的业务逻辑还是你自己比较清楚!
一般的做法可能大概分两种方式吧:
1.0 Spring定时任务(Quartz,timer) ,或者 thread 一类定时去扫描那个字段的值!最好有一个【最后的修改时间字段】!然后做不同的修改!
至于具体的怎么去修改,触发 应该不难吧! 或者直接用thread 也比较好控制!具体的代码只能结合你自己的代码写咯!
2.0 触发式刷新!就是每次读那个字段的时候 判断下 【前提是有个最后的刷新时间】
然后做一些处理!
大同小异吧! 个人感觉上面那些提议都是可以的!只要你理解了就好办!
一般的做法可能大概分两种方式吧:
1.0 Spring定时任务(Quartz,timer) ,或者 thread 一类定时去扫描那个字段的值!最好有一个【最后的修改时间字段】!然后做不同的修改!
至于具体的怎么去修改,触发 应该不难吧! 或者直接用thread 也比较好控制!具体的代码只能结合你自己的代码写咯!
2.0 触发式刷新!就是每次读那个字段的时候 判断下 【前提是有个最后的刷新时间】
然后做一些处理!
大同小异吧! 个人感觉上面那些提议都是可以的!只要你理解了就好办!
谢谢回答。
经过您和各位的提示,您看我这样设计合不合适:
在系统启动时,查询记录中所有状态为close的记录,并用一个Map保存每个记录的ID和open的时间,并在系统启动时用一个线程定时(如5分钟)扫描这个Map,如果记录的时间和系统时间差大于24小时,就修改状态为close。在系统运行中,每次修改记录状态时,如果改成start就同时将其ID从Map中移除(如果有的话),如果改成close,就将其加到Map中。
您觉得这样做可不可行,有什么缺点吗?
相关问答
更多-
windows下怎么设置tomcat开机一段时间后自动启动[2023-10-02]
我的电脑右键》管理》计算机管理》服务和应用程序》服务 在系统服务管理里面,选择tomcat服务,然后鼠标右键选择属性,就可以设置延迟启动了 -
linux一段时间后会自动锁定,ssh便断开连接,怎样解决?[2023-06-29]
你用什么软件登录的? 我使用的crt 有一个 no-op的功能 把他打开就可以了 他的功能是 没到XX秒 发送个信号给服务 ssh就不断开了. -
oracle数据库用了一段时间后突然就打不开了是什么原因???[2023-07-27]
我有一次碰到这个问题是因为进程没有完全杀干净 你试试重新在一个clean的环境里面启动 -
php连接mysql使用一段时间后连接数据库超时[2021-08-22]
php连接mysql读写数据,过一天就不work了。 经查发现mysql connection默认的超时时间为8小时。如果想让这个连接永久不超时,该怎么办呢? 有朋友说在mysql配置文件my.cfg中[mysqld]中添加 wait _timeout =31536000 (这里的这个数字的单位是秒,31536000秒=365天,这也是可设置的最大值) 这个办法不是最好的,因为这个"一年" != 永久..如何才能让该连接永久不超时呢? 比较完美的解决方法: 复制代码代码如下: function reconn ... -
windows下怎么设置tomcat开机一段时间后自动启动[2024-04-16]
我的电脑右键》管理》计算机管理》服务和应用程序》服务 在系统服务管理里面,选择tomcat服务,然后鼠标右键选择属性,就可以设置延迟启动了 -
我想像下面这样: table kid int pkey(id) text name table weight date when int kidid fkey(kid.id) int weight int pkey(id) I'd think something like the following: table kid int pkey(id) text name table weight date when int k ...
-
您可以使用任何类型的调度程序: https : //dev.mysql.com/doc/refman/5.7/en/event-scheduler.html 只需在那时执行DROP表。 如果有更多特定条件,您可以执行任意数量的操作,例如删除在特定时间内没有INSERT或UPDATE的表(使用触发器知道它们何时被修改并在表中跟踪它然后何时那个日期是某个年龄,DROP表)。 这有点不寻常,因为表往往不是DROPped,通常数据在归档过程中有选择地DELETEd但表格仍然存在。 You can use any s ...
-
我仍然不知道问题的原因是什么,但我猜测实体框架以某种方式失去了与数据库的连接,因为数据库可以被其他位置访问,而不是通过实体框架运行之后一会儿。 我发现DbContext类有一个构造函数,允许您在实例化时指定连接字符串。 我的解决方案是尝试使用它,希望它可以启动与数据库的新连接,而不是尝试使用旧的数据库。 有效。 自从我开始使用它以来,我没有任何中断。 这是我更改的内容(我的数据库称为CloudDatabases)。 CloudDatabases.Context.cs // Already present p ...
-
MySQL-可以在一段时间内备份mySQL数据库吗?(MySQL- Is it possible to backup mySQL database within a period of time? [closed])[2022-07-28]
我假设您要根据日期备份表ROWS,而不是表本身。 如果您的表具有date或timestamp列,则可以使用INTO OUTFILE查询基于日期备份某些行。 或者,从命令行,您可以将mysqldump与--where选项一起使用。 看到这个答案: MYSQL转储只有某些行 I am assuming you want to backup table ROWS based on date, not tables themselves. If your tables have a date or timestam ... -
您是否尝试在应用程序挂起时创建线程转储? 如果你在Linux上,你可以尝试: $ kill -3
线程转储被写入标准输出。 它可能会记录在控制台或/ logs / stdout或/logs/catalina.out中。 Have you tried creating a thread dump at the moment that your application hangs? If you're on linux you could try to do: $ kill -3 T ...