标签:
在软件开发中,经常性会用到定时任务。这个时候你可能会想到线程。但是事实中,线程方法比较麻烦、容易出错,资源竞争等问题,设计起来让你很头痛。
现在给大家提供一个新的思路,用SQL SERVER 的任务管理器来解决问题。
解决下列问题:
1、商品有购买时间限制。比如定时上线,下线。竞拍结束自动通知用户。
2、数据库中某个数据发生了变化,需要执行一段代码块(这里面的代码并不是存储过程代码,意指c#,JAVA等代码)。
3、某个数据发生了变化,需要执行某个动作。(不是立马执行)
针对上面的问题,我们总结出,该方案是以数据库中的数据发生改变,需要解决改变后的相关处理工作。
过去我们要完成这样的工作,我们必须要用到线程,来监控数据库的变化,根据变化来做相对应的处理。用线程的这种方法。我觉得远远不如用SQL SERVER任务这么简单高效。容易。
下面给出具体代码:
一、商品定时上线下线。
exec p_task @exeSql,@end_date,@end_time
update jp_shangpin set zhuangtai=1 where id=1
我指定要执行的时间。指定要执行的代码。这个代码实际就上改变一下一条数据的状态而已。
1、我要执行某个功能块如何办?(比如说,某个用户的费用快到期了,要发一条短信给用户,要发一条JPUSH给用户。如何办呢?)
exec p_url ‘http://111.111.111.111/task.aspx?ssss=222=3333‘
创立任务脚本:
GO /****** Object: StoredProcedure [dbo].[p_task] Script Date: 01/25/2016 16:23:56 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[p_task] @sql varchar(8000),--要执行的命令 @start_date int, --开始执行日期 @start_time int --开始执行时间 as declare @dbname varchar(100) declare @jobname varchar(100) --作业名称 set @jobname=newid() set @dbname=db_name() --创建作业 exec msdb..sp_add_job @job_name=@jobname --创建作业步骤 exec msdb..sp_add_jobstep @job_name=@jobname, @step_name = ‘数据处理‘, @subsystem = ‘TSQL‘, @database_name=@dbname, @command = @sql, @retry_attempts = 5, --重试次数 @retry_interval = 5 --重试间隔 --创建调度 EXEC msdb..sp_add_jobschedule @job_name=@jobname, @enabled=1, @name = ‘时间安排‘, @freq_type=1 , @active_start_date=@start_date, @active_start_time=@start_time -- 添加目标服务器 EXEC msdb.dbo.sp_add_jobserver @job_name = @jobname , @server_name = N‘(local)‘ --作业完成自动删除 EXEC msdb.dbo.sp_update_job @job_name = @jobname , @delete_level=1
SQL访问URL(有了这个功能你可以调用所有代码了。)
/****** Object: StoredProcedure [dbo].[p_url] Script Date: 01/25/2016 16:24:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[p_url] @url nvarchar(1000), --url地址 @value nvarchar(1000) out --值,如果指定为null,则获取application的值 as declare @err int,@src varchar(255),@desc varchar(255) declare @obj int,@urlstr nvarchar(4000),@function varchar(4) select @function=CASE WHEN @value IS NULL THEN ‘GET‘ ELSE ‘POST‘ END, @urlstr=@url +CASE WHEN @value IS NULL THEN ‘‘ ELSE N‘&value=‘+rtrim(@value) END exec @err=sp_oacreate ‘MICROSOFT.XMLHTTP‘,@obj out if @err<>0 goto lberr exec @err=sp_oamethod @obj,‘open‘,null,@function,@urlstr,0 if @err<>0 goto lberr exec @err=sp_oamethod @obj,‘send‘,null,‘‘ if @err<>0 goto lberr if @function=‘GET‘ begin exec @err=sp_oagetproperty @obj,‘ResponseText‘,@value output if @err<>0 goto lberr end --print @value exec @err=sp_oadestroy @obj return lberr: exec sp_oageterrorinfo 0,@src out,@desc out select cast(@err as varbinary(4)) as 错误号 ,@src as 错误源,@desc as 错误描述
写的有些零散,改天我定会包装一下。争取把好处与原理讲的更清楚。
这里面的好处,与坏处你自己来体会。做过自然会懂的。
标签:
原文地址:http://www.cnblogs.com/lystory/p/5157784.html