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

这样就搞定了,
目录
相关文章
|
2月前
|
人工智能 运维 关系型数据库
云栖大会|AI时代的数据库变革升级与实践:Data+AI驱动企业智能新范式
2025云栖大会“AI时代的数据库变革”专场,阿里云瑶池联合B站、小鹏、NVIDIA等分享Data+AI融合实践,发布PolarDB湖库一体化、ApsaraDB Agent等创新成果,全面展现数据库在多模态、智能体、具身智能等场景的技术演进与落地。
|
6月前
|
人工智能 安全 机器人
无代码革命:10分钟打造企业专属数据库查询AI机器人
随着数字化转型加速,企业对高效智能交互解决方案的需求日益增长。阿里云AppFlow推出的AI助手产品,借助创新网页集成技术,助力企业打造专业数据库查询助手。本文详细介绍通过三步流程将AI助手转化为数据库交互工具的核心优势与操作指南,包括全场景适配、智能渲染引擎及零代码配置等三大技术突破。同时提供Web集成与企业微信集成方案,帮助企业实现便捷部署与安全管理,提升内外部用户体验。
630 12
无代码革命:10分钟打造企业专属数据库查询AI机器人
|
8月前
|
关系型数据库 分布式数据库 数据库
一库多能:阿里云PolarDB三大引擎、四种输出形态,覆盖企业数据库全场景
PolarDB是阿里云自研的新一代云原生数据库,提供极致弹性、高性能和海量存储。它包含三个版本:PolarDB-M(兼容MySQL)、PolarDB-PG(兼容PostgreSQL及Oracle语法)和PolarDB-X(分布式数据库)。支持公有云、专有云、DBStack及轻量版等多种形态,满足不同场景需求。2021年,PolarDB-PG与PolarDB-X开源,内核与商业版一致,推动国产数据库生态发展,同时兼容主流国产操作系统与芯片,获得权威安全认证。
|
3月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
361 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
8月前
|
并行计算 关系型数据库 MySQL
如何用 esProc 将数据库表转储提速查询
当数据库查询因数据量大或繁忙变慢时,可借助 esProc 将数据导出为文件进行计算,大幅提升性能。以 MySQL 的 3000 万行订单数据为例,两个典型查询分别耗时 17.69s 和 63.22s。使用 esProc 转储为二进制行存文件 (btx) 或列存文件 (ctx),结合游标过滤与并行计算,性能显著提升。例如,ctx 并行计算将原查询时间缩短至 0.566s,TopN 运算提速达 30 倍。esProc 的简洁语法和高效文件格式,特别适合历史数据的复杂分析场景。
|
7月前
|
关系型数据库 MySQL Linux
实现MySQL数据库的定时自动备份脚本。
拿走,不谢,这个脚本配方(指引)保证你的数据库数据像蛋糕店一样地天天更新,还能确保老旧的蛋糕(数据)不会堆积满仓库。这下可好,数据安全有保障,数据库管理员也能轻松一点,偶尔闲下来的时候,煮杯咖啡,看个剧岂不美哉?别忘了偶尔检查一下你的自动备份是否正常工作,以防万一蛋糕机器出了点小差错。
337 20
|
6月前
|
人工智能 运维 数据挖掘
瑶池数据库开放日:全新发布Data+AI能力家族,赋能企业全栈智能实践
近日,阿里云瑶池数据库生态工具产品重磅升级,推出“Data+AI能力家族”,并举办了为期3天的全栈智能实践开放日活动。发布会上首次公开了 “Data Agent for Analytics、Data Agent for Meta、DAS Agent”等瑶池数据库Data Agent系列能力,以工具智能化 × 智能化工具的双引擎重构数据与AI的协同边界,揭秘AI时代数据价值释放的全新路径。
|
7月前
|
SQL 人工智能 数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
471 0
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
|
8月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
199 15

热门文章

最新文章