企业定时任务调度器Quartz,定时查询数据库(这里还需要继续做研究)

简介:    看到楼下各位兄弟的批评指正后,确实对我很有启发,任务如果都以配置的形式出现,在项目中是很利于维护的,所以,稍作修改,呵呵。  首先要做QuartzJob定时任务类了,这个类要实现的是Job接口,然后重写execute方法,方法中就是执行你具体要做的事情了。不过首先需要一个配置文件,里面定义了一些参数,是Quartz的一些配置。配置文件如下  Java代码  
   看到楼下各位兄弟的批评指正后,确实对我很有启发,任务如果都以配置的形式出现,在项目中是很利于维护的,所以,稍作修改,呵呵。 

首先要做QuartzJob定时任务类了,这个类要实现的是Job接口,然后重写execute方法,方法中就是执行你具体要做的事情了。不过首先需要一个配置文件,里面定义了一些参数,是Quartz的一些配置。配置文件如下 
Java代码    收藏代码
  1. #============================================================================  
  2. # Configure Main Scheduler Properties    
  3. #============================================================================  
  4. org.quartz.scheduler.instanceName = QuartzScheduler  
  5. org.quartz.scheduler.instanceId = AUTO  
  6.   
  7. #============================================================================  
  8. # Configure ThreadPool    
  9. #============================================================================  
  10. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  11. org.quartz.threadPool.threadCount = 3  
  12. org.quartz.threadPool.threadPriority = 5  
  13.   
  14. #===============================================================  
  15. #Configure JobStore  
  16. #===============================================================  
  17. org.quartz.jobStore.misfireThreshold = 60000  
  18. org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore  
  19.   
  20. #============================================================================  
  21. # Configure Plugins   
  22. #============================================================================  
  23. #org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin  
  24. org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin  
  25. org.quartz.plugin.jobInitializer.fileName = conf/quartz_jobs.xml  
  26. org.quartz.plugin.jobInitializer.overWriteExistingJobs = true  
  27. org.quartz.plugin.jobInitializer.failOnFileNotFound = true  
  28. org.quartz.plugin.jobInitializer.scanInterval = 60  


即使做成配置,这个类也必须要有,一定会有个Job类,专门做数据分析,有的朋友说配置文件搞定所有,不现实,  
好了,这就是配置文件,接下来我们就要做这个计划类了,这个类执行的是去源数据库中查询数据,并插入目标数据库中,并且不允许有重复。代码如下  

Java代码    收藏代码
  1. package com.bj58.job.servlet;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7.   
  8. import org.apache.commons.logging.Log;  
  9. import org.apache.commons.logging.LogFactory;  
  10. import org.quartz.Job;  
  11. import org.quartz.JobExecutionContext;  
  12. import org.quartz.JobExecutionException;  
  13.   
  14. import com.bj58.job.utils.ConnectionFactory_DB_dest;  
  15. import com.bj58.job.utils.ConnectionFactory_DB_src;  
  16.   
  17. /** 
  18.  * 定时任务类 
  19.  * @author zhangwan@58.com 
  20.  * Jun 8, 2010 
  21.  * 
  22.  */  
  23. public class QuartzJob implements Job {  
  24.     private static final Log log = LogFactory.getLog(Job.class);  
  25.     private static final String findSql_src = "select PortalId from t_portalinfo";  
  26.     private static final String findSql_dest = "select userId from t_user";  
  27.     private static final String insertSql_dest = "insert into t_user(userId) values (?)";  
  28.       
  29.     /** 
  30.      * 执行任务方法 
  31.      */  
  32.     @Override  
  33.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  34.         Connection conn_db_src = ConnectionFactory_DB_src.getConnection();  
  35.         Connection conn_db_dest = ConnectionFactory_DB_dest.getConnection();  
  36.         PreparedStatement pstmt_src = null;  
  37.         PreparedStatement pstmt_dest = null;  
  38.         ResultSet rs_src = null;  
  39.         ResultSet rs_dest = null;  
  40.         try {  
  41.             pstmt_src = conn_db_src.prepareStatement(findSql_src);  
  42.             rs_src = pstmt_src.executeQuery();  
  43.   
  44.             pstmt_dest = conn_db_dest.prepareStatement(findSql_dest);  
  45.             rs_dest = pstmt_dest.executeQuery();  
  46.             pstmt_dest = conn_db_dest.prepareStatement(insertSql_dest);  
  47.               
  48.             while(rs_dest.next()) { //第二次或第n次入库,第一次入库的话rs_dest没有结果,所以此段操作都不执行  
  49.                 String userId = rs_dest.getString(1);  
  50.                 while (rs_src.next()) {  
  51.                     String protalId = rs_src.getString(1);  
  52.                     if(userId.equals(protalId)) { //如果两个结果相同,则不进行入库  
  53.                         break;  
  54.                     } else {  
  55.                         pstmt_dest.setString(1, protalId);  
  56.                         pstmt_dest.execute();  
  57.                     }  
  58.                 }  
  59.             }  
  60.               
  61.             while (rs_src.next()) { //如果是第一次入库  
  62.                 String protalId = rs_src.getString(1);  
  63.                 pstmt_dest.setString(1, protalId);  
  64.                 pstmt_dest.execute();  
  65.                   
  66.             }  
  67.             log.info("存储数据...");  
  68.         } catch (SQLException e) {  
  69.             log.info("存储数据出现异常...");  
  70.             e.printStackTrace();  
  71.         } finally {  
  72.             ConnectionFactory_DB_dest.free(rs_dest, pstmt_dest, conn_db_dest);  
  73.             ConnectionFactory_DB_src.free(rs_src, pstmt_src, conn_db_src);  
  74.             log.info("数据库连接已经关闭...");  
  75.         }  
  76.   
  77.     }  
  78. }  

这里一次性查出了源数据库中所有字段,因为源数据库表中的数据最多不会超过10000条,我在做测试的时候,在本机上发现一次查询10W条也不会出现结果集溢出情况,所以这里就忽略这个问题了。  

然后需要这么个配置文件quartz_jobs.xml,内容如下  
Java代码    收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <quartz>  
  3.     <job>  
  4.         <job-detail>  
  5.             <name>PortalInfoJob</name>  
  6.             <group>PortalInfo</group>  
  7.             <job-class>com.bj58.portalcrm.web.job.PortalInfoJob</job-class>  
  8.         </job-detail>  
  9.         <trigger>  
  10.             <cron>  
  11.                 <name>PORTALINFO</name>  
  12.                 <job-name>PortalInfoJob</job-name>  
  13.                 <job-group>PortalInfo</job-group>  
  14.                 <cron-expression>0 0 1 * * ?</cron-expression>  
  15.             </cron>  
  16.         </trigger>  
  17.     </job>  
  18. </quartz>  


ok,最后就是web.xml文件配置一下,Quartz提供了个初始化的Servlet,呵呵,内容如下  
Java代码    收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"   
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.       
  8.     <welcome-file-list>  
  9.         <welcome-file>index.jsp</welcome-file>  
  10.     </welcome-file-list>  
  11.     
  12.     <!-- Quartz配置计划 -->  
  13.     <servlet>     
  14.          <servlet-name>QuartzInitializer</servlet-name>     
  15.          <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>     
  16.          <load-on-startup>1</load-on-startup>     
  17.          <init-param>     
  18.              <param-name>config-file</param-name>     
  19.              <param-value>/quartz.properties</param-value>     
  20.          </init-param>     
  21.          <init-param>     
  22.              <param-name>shutdown-on-unload</param-name>     
  23.              <param-value>true</param-value>     
  24.          </init-param>     
  25.     </servlet>  
  26. </web-app>  

这样就搞定了,
目录
相关文章
|
6天前
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
13 1
|
10天前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
|
13天前
|
存储 缓存 关系型数据库
如何优化数据库查询?
【7月更文挑战第2天】如何优化数据库查询?
18 1
|
9天前
|
SQL 存储 数据库
MSSQL数据库性能调优实战:索引、查询与并发控制的深度剖析
在数据库管理领域,Microsoft SQL Server(MSSQL)的性能调优是保障业务高效运行的核心任务
|
11天前
|
SQL 关系型数据库 MySQL
Navicate,数据库,Mysql,改表,4月29日Finished - Unsuccessfully,导出数据不妨,右键,备份一下Mysql数据库的内容,你想导入和导出数据不如,用查询的方式去做
Navicate,数据库,Mysql,改表,4月29日Finished - Unsuccessfully,导出数据不妨,右键,备份一下Mysql数据库的内容,你想导入和导出数据不如,用查询的方式去做
|
11天前
|
小程序 数据库
【微信小程序-原生开发】实用教程15 - 列表的排序、搜索(含云数据库常用查询条件的使用方法,t-search 组件的使用)
【微信小程序-原生开发】实用教程15 - 列表的排序、搜索(含云数据库常用查询条件的使用方法,t-search 组件的使用)
10 0
|
12天前
|
SQL Java 数据库连接
Java中实现优化的数据库访问和查询性能
Java中实现优化的数据库访问和查询性能
|
9天前
|
存储 关系型数据库 MySQL
探索MySQL:关系型数据库的基石
MySQL,作为全球最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于各种Web应用、企业级应用和数据仓库中
|
7天前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
919 6
Mysql 数据库主从复制
|
7天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。