在软件开发中,经常性会用到定时任务。这个时候你可能会想到线程。但是事实中,线程方法比较麻烦、容易出错,资源竞争等问题,设计起来让你很头痛。

现在给大家提供一个新的思路,用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/TTTT/archive/2009/12/23/1630265.html

 

posted on 2016-01-25 17:20  梦回过去  阅读(705)  评论(0编辑  收藏  举报