企业定时任务调度器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>  

这样就搞定了,
目录
相关文章
|
22天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
1月前
|
SQL 缓存 PHP
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
65 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
1月前
|
SQL 存储 JSON
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
亲爱的社区小伙伴们,Apache Doris 2.1.0 版本已于 2024 年 3 月 8 日正式发布,新版本开箱盲测性能大幅优化,在复杂查询性能方面提升100%,新增Arrow Flight接口加速数据读取千倍,支持半结构化数据类型与分析函数。异步多表物化视图优化查询并助力仓库分层建模。引入自增列、自动分区等存储优化,提升实时写入效率。Workload Group 资源隔离强化及运行时监控功能升级,保障多负载场景下的稳定性。新版本已经上线,欢迎大家下载使用!
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
|
1月前
|
存储 NoSQL Redis
【Redis】利用Redis List实现数据库分页快速查询
【Redis】利用Redis List实现数据库分页快速查询
110 0
|
1月前
|
存储 缓存 NoSQL
利用Redis List实现数据库分页快速查询的有效方法
利用Redis List实现数据库分页快速查询的有效方法
|
2月前
|
存储 机器学习/深度学习 人工智能
打造企业智能体(AI Agent)的重要技术-向量数据库
本篇介绍的是为通用大模型增加专业业务能力的重要技术:向量数据库
打造企业智能体(AI Agent)的重要技术-向量数据库
|
1月前
|
NoSQL Java 数据库连接
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
356 1
|
1月前
|
SQL 关系型数据库 MySQL
用 Python 连接数据库并进行查询。
【2月更文挑战第12天】【2月更文挑战第32篇】用 Python 连接数据库并进行查询。
|
1月前
|
存储 数据处理 数据库
构建高性能的数据库查询引擎
本文将介绍如何构建一个高性能的数据库查询引擎,以提升数据库查询的效率和响应速度。通过优化查询计划、索引设计和数据存储等方面,可以实现更快速和可扩展的数据库查询,为应用程序提供更好的用户体验和数据处理能力。

热门文章

最新文章