关于java用Quertz定时进行数据库同步的简单操作

1. 首先需要添加定时器Quertz的依赖

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

2. 定时器Quertz的xml文件配置

<!--定时器需要执行的代码(开始):每天凌晨2点执行该方法 同步数据-->  
   	<bean id="synchroEventReportTask" class="org.hyena.aers.task.SynchroEventReportTask"></bean>  
    <!-- 设定执行代码中的具休方法  --> 
    <bean id="synchroEventReportDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <property name="targetObject">  
            <ref bean="synchroEventReportTask"/>  
        </property>  
        <property name="targetMethod">  
            <value>synchroEventReport</value>  
        </property> 
    </bean>
    <bean id="synchroEventReportTriggers" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
        <property name="jobDetail">  
            <ref bean="synchroEventReportDetails" />  
        </property> 
        <property name="cronExpression"> 
         	<!--每天半夜1230分执行一次:0 30 0 * * ? (注意日期域为0不是24)
			            每天凌晨1点执行一次:0 0 1 * * ?
			            每天上午1015执行一次: 0 15 10 ? * *0 15 10 * * ?0 15 10 * * ? *
			            每天中午十二点执行一次:0 0 12 * * ? 
         		每天凌晨2点执行   -->
			<value>0 0 02 * * ?</value>
        </property>
   	</bean>
   <!-- 定时器执行 同步事件上报数据  --> 
    <bean id="synchroEventReport" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="triggers">  
            <list>  
                <ref bean="synchroEventReportTriggers" />
            </list>  
        </property>  
    </bean>  
    <!-- 定时器需要执行的代码(结束)-->

bean id="synchroEventReportTask"为class="org.hyena.aers.task.synchroEventReportTask"的封装,即自己后台中控制数据库同步的方法的封装名,后面的bean又以新的名称进行封装。

3.后台代码

主要就是连接双方的数据库,代码有详细注解,
需要导入的包我就只写关键的一些。

package org.hyena.aers.task;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;

@SuppressWarnings({ "unused", "rawtypes" })
public class SynchroEventReportTask{
/**
	 /* @function:每天凌晨2点同步
	 */
	 @SuppressWarnings("unchecked")
	public void synchroEventReport() {
		Connection conn = null;
		Connection conn1 = null;
		Statement stmt = null;
		Statement stmt1 = null;
		ResultSet rs = null;
		ResultSet rs1 = null;
		StringBuffer sql = new StringBuffer();
		try {
            //开始进行需要获取数据的服务器连接
            //因为该项目使用的是sqlserver,所以用的是sqlserver驱动,如果是其他数据库的,请修改为对应的数据库驱动.
            
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			conn1 = DriverManager.getConnection("jdbc:sqlserver://192.168.10.135:1433(需要获取数据的服务器站点);DatabaseName=123(数据库名称);", "123(账号)","123(密码)");
			stmt = conn1.createStatement();
			//因为查询出多条记录,并且每条记录有多个字段,所以用List<Map<String, Object>>集合来存放数据
			List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
	//编写sql语句,获取自己需要取得数据,我这里写个简单示例
	sql.append("select username,userid from user");
	//执行查询的sql
	rs = stmt.executeQuery(sql.toString());
	//循环遍历rs结果集,将结果集存放到list集合中
	while (rs.next()) {
			Map<String, Object> map = new HashMap<String, Object>();
	        //将查询出的结果集中的数据分别用变量存放
	        map.put("username", rs.getString("username"));
			map.put("userid ", rs.getString("userid "));
			listMap.add(map);
		}
		//关闭数据库连接
		conn1.close();
		stmt.close();
		rs.close();
		//将远程数据库的数据存放到listMap集合后开始连接需要同步数据到自己这里的数据库(同上,数据库不同,更换下驱动)
		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			conn = DriverManager.getConnection("jdbc:sqlserver://192.168.10.187:1433;DatabaseName=123", "123",
					"123");
			stmt1 = conn.createStatement();
			StringBuffer sql1 = new StringBuffer();
			StringBuffer sqlInsert = new StringBuffer();
			//如果从前面的数据库里取到了数据
			if(listMap.size()>0) {
				for (int i = 0; i < listMap.size(); i++) {
					String username = (String) listMap.get(i).get("username ");			
					String userid = (String) listMap.get(i).get("userid ");
					//进行同步的sql语句
					sqlInsert.append("insert into user(username,userid) values('username', userid')");
					//查询数据是否重复
					sql1.append("select count(1) as t from user where userid = " + userid);
					rs1 = stmt1.executeQuery(sqlRepate.toString());	
					if (rs1.next()) {
						if ("0".equals(rs1.getString("zs"))) {//没有重复数据就运行插入语句
							stmt1.execute(sqlInsert.toString());		
								}
						}
				}
		}
		stmt1.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (rs1 != null) {
				try {
					rs1.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (stmt1 != null) {
				try {
					stmt1.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn1 != null) {
				try {
					conn1.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}
}

4 总结

虽然我这里写的比较简单,不过实际操作的时候还是有很多需要注意的地方。比如说数据库量大,参数过多的时候,就需要对参数一个个进行检验,因为只要一个字母写错就会导致程序报错而运行不了。所以大家在进行同步数据库之前需要把数据库进行下备份,这样就不会引起数据的错误。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值