Quartz integration within Spring for Invoke SQL stored procedure
2012-05-25 11:12
323 查看
通常的数据库要定时作业执行某些SQL语句块。可以用以下方案:
1. 应用程序调用存储过程
2. 数据库管理工具里进行作业调度。
3. 特殊情况下可以是trigger,前提是有相应的event 来出发。
对于DBA来说方案2是比较省事的。
打开企业管理器,进入你服务器名下的“管理”,启动SQL Server代理(SQLServer Agent (MSSQLSERVER))。然后查看服务器属性,选中“自动(automatic)启动SQL Server代理”。
接下来进入SQL Server代理下的“作业”,在右边点右键选“新建作业”。
在“常规”里,随便输入一个作业名,分类要选最后一项“数据库维护”。
在“步骤”里,点“新建步骤”,随便输入一个步骤名,数据库选成你的数据库,命令里输入你删除记录的语句,也可以通过“打开”来装载T-SQL脚本,弄好后记得分析一下,没有问题再继续。在“高级”里将“失败时的操作”改成“转到下一步”。
在“调度”里,点“新建调度”,随便输入一个调度名,点“更改”,“发生频率”选每天,“一次发生于”里设置17:00:00,然后点“确定”,再点“确定”,再点“确定”,配置就完成了。
对于大多是情况下的程序调用,在SSH我们结合Spring的QuartZ框架来完成。quartz 最新的是1.6版本。
注意,最好是spring1.2.8以上版本,否则会很难,在配置Quartz的时候会出问题。启动直接报错:
org.springframework.beans.factory.BeanCreationException:
org.quartz.ObjectAlreadyExistsException:
========
jar列表如下:
/WebRoot/WEB-INF/lib/spring-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-core-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-dao-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-hibernate-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-mock-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-support-1.2.8.jar
/WebRoot/WEB-INF/lib/quartz-all-1.6.0.jar
建立存储过程:
调用存储过程ObsoletePersonDAO实现.java
添加配置:
我的项目直接是写到applicationContext.xml里面
以上的配置是只有有1个触发作业, 每天早上4点去触发cleanUp。
在配置文件当中
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean中的<property>
targetMethod 是自己写的service的 实现方法名(Method name)。
concurrent 是否并发 可不写 默认是false。
org.springframework.scheduling.quartz.CronTriggerBean的就是注意触发时间配置<property
cronExpression "0 0 9 4 * ?" 从左到右 每一位分别代表 秒 分 时 日 月 周 年(可选) 更要注意的是每位之间要用 空格 分割。
*代表所有的值。
?代表允许的日期或者星期位。用于占位说明没有特殊的指明。
—代表to 闭合区间。
,代表额外的值。
/ 用于指定增量。比如 0/15 放在分钟位代表0 1530 45 60的时候都会触发,就相当于自定义每隔15分钟去执行一次。*/N 代表从0开始到指定的N。
更多更详细的配置请访问http://docs.netkernel.org/book/view/book:mod:cron/doc:mod:cron:cronexpression。下面给出一些常用的例子。
"0 0 14 * * ?" 每天中午14点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
0 6 * * * “ 每天早上6点
0 */2 * * *” 每两个小时
0 23-7/2,8 * * *” 晚上11点到早上8点之间每两个小时,早上八点“
0 11 4 * 1-3” 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 4 1 1 * “ 1月1日早上4点
1. 应用程序调用存储过程
2. 数据库管理工具里进行作业调度。
3. 特殊情况下可以是trigger,前提是有相应的event 来出发。
对于DBA来说方案2是比较省事的。
打开企业管理器,进入你服务器名下的“管理”,启动SQL Server代理(SQLServer Agent (MSSQLSERVER))。然后查看服务器属性,选中“自动(automatic)启动SQL Server代理”。
接下来进入SQL Server代理下的“作业”,在右边点右键选“新建作业”。
在“常规”里,随便输入一个作业名,分类要选最后一项“数据库维护”。
在“步骤”里,点“新建步骤”,随便输入一个步骤名,数据库选成你的数据库,命令里输入你删除记录的语句,也可以通过“打开”来装载T-SQL脚本,弄好后记得分析一下,没有问题再继续。在“高级”里将“失败时的操作”改成“转到下一步”。
在“调度”里,点“新建调度”,随便输入一个调度名,点“更改”,“发生频率”选每天,“一次发生于”里设置17:00:00,然后点“确定”,再点“确定”,再点“确定”,配置就完成了。
对于大多是情况下的程序调用,在SSH我们结合Spring的QuartZ框架来完成。quartz 最新的是1.6版本。
注意,最好是spring1.2.8以上版本,否则会很难,在配置Quartz的时候会出问题。启动直接报错:
org.springframework.beans.factory.BeanCreationException:
org.quartz.ObjectAlreadyExistsException:
========
jar列表如下:
/WebRoot/WEB-INF/lib/spring-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-core-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-dao-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-hibernate-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-mock-1.2.8.jar
/WebRoot/WEB-INF/lib/spring-support-1.2.8.jar
/WebRoot/WEB-INF/lib/quartz-all-1.6.0.jar
建立存储过程:
create or replace procedure sp_delete_dirty_records(此次省略很多SQL 语句);
调用存储过程ObsoletePersonDAO实现.java
public String deleteDirtyRecords(final String columnName){ return (String)this.getHibernateTemplate().execute(new HibernateCallback() { @SuppressWarnings("deprecation") public Object doInHibernate(final Session session) throws HibernateException, SQLException { String errorMsg = ""; CallableStatement call = session.connection().prepareCall("{call sp_delete_dirty_records(?,?)}"); call.registerOutParameter(1, Types.VARCHAR); call.setString(2, columnName); call.execute(); errorMsg = call.getString(1); return errorMsg; } }); } CleanupService.java public class CleanupService { private ObsoletePersonDAO obsoletePersonDao; public void cleanUp(){ obsoletePersonDao.deleteDirtyRecords("Employment"); }
添加配置:
我的项目直接是写到applicationContext.xml里面
<bean id="aggregationCleanupProcessor" class="com.consultants.aggregation.service.CleanupService"> <property name="obsoletePersonDao"> <ref bean="obsoletePersonDao" /> </property> </bean> <bean id="aggregationCleanup" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--指定目标类--> <property name="targetObject" ref="aggregationCleanupProcessor" /> <!--指定目标类方法--> <property name="targetMethod" value="cleanUp" /> <!--指定是否并发--> <property name="concurrent" value="false" /> </bean> <bean id="aggregationCleanupTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="aggregationCleanup" /> <!-- run every morning at 4 AM --> <property name="cronExpression" value="0 0 4 * * ?" /> </bean> <bean lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <propertyname="autoStartup" value="true"/>这个地方要配一下lazy-init="false",否则不能自动启动! <property name="triggers"> <list> <ref bean="aggregationCleanupTrigger" /> <ref bean ........ any more SchedulerFactoryBean can be fill in this <list> </list> </property> </bean>
以上的配置是只有有1个触发作业, 每天早上4点去触发cleanUp。
在配置文件当中
<pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><pre>
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean中的<property>
targetMethod 是自己写的service的 实现方法名(Method name)。
concurrent 是否并发 可不写 默认是false。
org.springframework.scheduling.quartz.CronTriggerBean的就是注意触发时间配置<property
cronExpression "0 0 9 4 * ?" 从左到右 每一位分别代表 秒 分 时 日 月 周 年(可选) 更要注意的是每位之间要用 空格 分割。
*代表所有的值。
?代表允许的日期或者星期位。用于占位说明没有特殊的指明。
—代表to 闭合区间。
,代表额外的值。
/ 用于指定增量。比如 0/15 放在分钟位代表0 1530 45 60的时候都会触发,就相当于自定义每隔15分钟去执行一次。*/N 代表从0开始到指定的N。
更多更详细的配置请访问http://docs.netkernel.org/book/view/book:mod:cron/doc:mod:cron:cronexpression。下面给出一些常用的例子。
"0 0 14 * * ?" 每天中午14点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
0 6 * * * “ 每天早上6点
0 */2 * * *” 每两个小时
0 23-7/2,8 * * *” 晚上11点到早上8点之间每两个小时,早上八点“
0 11 4 * 1-3” 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 4 1 1 * “ 1月1日早上4点
相关文章推荐
- Spring StoredProcedure for Oracle cursor
- SQL Stored Procedure Wrapper & Typed DataSet Generator for .NET
- SQL Stored Procedure Wrapper &amp; Typed DataSet Generator for .NET
- illustrates how to call a SQL Server stored procedure
- Diffrence between Stored Procedure and User Define Function in SQL
- A Simple Tip on SQL Server Stored Procedure
- org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for
- spring quartz 定时任务“Failed to load class "org.slf4j.impl.StaticLoggerBinder”“Checking for available updated version of Quartz”
- To SP or not to SP in SQL Server: an argument for stored procedures
- Spring 4 + Quartz 2.2.1 Scheduler Integration Example
- Dejan Sunderic, «Microsoft SQL Server 2005 Stored Procedure Programming in T-SQL & .NET» (3rd edition)
- pagerprocedureforsqlserver
- Spring jdbcTemplate.queryForInt(sql)的奇怪问题,呵呵
- pager procedure for sql server
- Microsoft SQL Server 2005 Stored Procedure Programming in T-SQL & .NET
- 1318:Incorrect number of arguments for PROCEDURE worker.wage_alterdata; expected 7, got 6 [ SQL语句 ]
- Spring&Quartz使用数据库集群配置(MySQL/SQLServer/Oracle)
- Nested transactions in stored procedure of SQLServer
- Privileges for Debugging PL/SQL and Java Stored Procedures
- [转载]:How to pass a list of values or array to SQL Server stored procedure?