软件开发中 SQL SERVER 任务的用法
在软件开发中,经常性会用到定时任务。这个时候你可能会想到线程。但是事实中,线程方法比较麻烦、容易出错,资源竞争等问题,设计起来让你很头痛。
现在给大家提供一个新的思路,用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
软件开发中 SQL SERVER 任务的用法的更多相关文章
- Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义
Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义 首先我们指明,任何一种行动以及教派修行方法都有他的多元化,只看到某一方面,就不能很好的评估利弊,适不适合自己使 ...
- win7中 SQL server 2005无法连接到服务器,错误码:18456
win7中 SQL server 2005无法连接到服务器,错误码:18456.. 数据库刚装完.我用Windows登陆 结果登陆不上去.. 选中SQL Server Management Stud ...
- 软件开发中的完整测试所包括的环节UT、IT、ST、UAT
软件开发中的完成测试环境所包括的环节包括:UT.IT.ST.UAT UT = Unit Test 单元测试 IT = System Integration Test 集成测试ST = System T ...
- paip.java 开发中web server的选择jboss resin tomcat比较..
paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- 关于软件开发中兼容win7注册表的解决方案
关于软件开发中兼容win7注册表的解决方案 编写人:CC阿爸 2014-3-14 l 近来在开发一winform程序时,发现在xp 系统访问注册表一切正常.可偏这个时候,微软又提醒大家.Xp今年 ...
- Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向 1. 一个伟大的事业必然是过程导向为主 1 1.1. 过程的执行情况(有明确的执行手册及标准) ...
- UML在软件开发中各个阶段的作用和意义
经典的软件工程思想将软件开发分成5个阶段:需求分析,系统分析与设计,系统实现,测试及维护五个阶段. 之所以如此,是因为软件开发中饣含了物和人的因素,存在着很大的不确定性,这使得软件工程不可能像理想的, ...
- Java软件开发中迭代的含义
软件开发中,各个开发阶段不是顺序执行的,而各个阶段都进行迭代并行执行的,然后在进入下一个阶段的开发. 这样对于开发中的需求变化,及人员变动都能得到更好的适应. 软件开发过程汇总迭代模型如下图所示:
- 软件开发中oracle查询常用方法总结
上次新霸哥和大家讲解了一些关于oracle的知识发现大家对oracle还是比较感兴趣的,下面新霸哥就大家比较关系的oracle中常用的查询有哪几种?做个和oracle相关的开发的朋友可能会知道答案,但 ...
随机推荐
- hmac md5
import hmac //内置 def simaplemd5(str): m2 = hashlib.md5() m2.update(str) res=m2.hexdigest() return re ...
- 基于Java SE集合的图书管理系统
图书管理系统一.需求说明1.功能:登录,注册,忘记密码,管理员管理,图书管理.2.管理员管理:管理员的增删改查.3.图书管理:图书的增删改查.4.管理员属性包括:id,姓名,性别,年龄,家庭住址,手机 ...
- 1.5.2、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用内部包存储库)
本主题描述如何在Cloudera Manager部署中创建内部包存储库和直接主机以使用该存储库.您可以创建永久或临时存储库. 完成这些步骤后,您可以安装特定版本的Cloudera Manager或在未 ...
- 如何从Windows中删除Node.js
如何从Windows中删除Node.js: 1.从卸载程序卸载程序和功能. 2.重新启动(或者您可能会从任务管理器中杀死所有与节点相关的进程). 3.寻找这些文件夹并删除它们(及其内容)(如果还有). ...
- tomcat 启动报错org.hibernate.cfg.annotations.SimpleValueBinder.setType
url: https://blog.csdn.net/zhx_0323/article/details/78844323 # A fatal error has been detected by th ...
- I/O复用之epoll
epoll 简介 epoll是为处理大批量句柄而作了改进的poll,它是在2.5.44内核中被引进的. 相关函数调用 int epoll_create(int size); 创建一个epoll的句柄. ...
- extJS 动态引用加载(转)
ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可以引入动态加载的概念来即用即取.这些代码都要写在Ext.onReady外面. 1.动态引用外部Js //加载配置可用 Ext.Loa ...
- ORACLE 如何产生一个随机数
1.select dbms_random.string('x', 3) from dual ; x是类型,3是长度. /* opt可取值如下: 'u','U' : 大写字母 'l','L' ...
- Redis数据结构的多种用法
分布式锁(string) setnx key value,当key不存在时,将 key 的值设为 value ,返回1.若给定的 key 已经存在,则setnx不做任何动作,返回0. 当setnx返回 ...
- centos7.2 增加3T的XFS模式分区
parted -l 查看分区情况与要分区的设备 # parted /dev/sda #选定要操作的硬盘 此时命令提示符会变成(parted) (par ...