MySQL数据库同步小工具(Java实现)
近期公司做个报表系统,为了报表系统中复杂的查询条件,不影响线上业务系统的使用,研究了一下MySQL数据库同步,下面用Java代码实现MySQL数据库同步,以便自己查阅!
数据库同步实现功能点:
1.支持跨服务器跨库的多线程同步
2.每张表的同步有日志记录
3.每次同步记录数可配置
源码和具体的使用细则,可以到下载源码及使用说明请添加链接描述 。
一、数据同步核心代码
package com.zrscsoft.synchtool.db;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;import cn.com.dd.connector.db.ConnectionPoolManager;import com.synch.connector.DataBaseUtil;
import com.synch.connector.DataSourceConnectDBVO;
import com.synch.connector.TableFieldVO;
import com.zrscsoft.synchtool.util.PropertyUtil;
import com.zrscsoft.synchtool.util.StringUtil;public class SynchMain {public void addSynchLog(Connection bakconn, String synchtable,String synchsql, String syncherr, String synchtime) {PreparedStatement bakps = null;try {String bakInsertSQL = "insert into sys_synchlog (synchtable,synchsql,syncherr,synchtime,createtime) values ('"+ synchtable+ "','"+ synchsql+ "',?,'"+ synchtime + "',now())";bakps = bakconn.prepareStatement(bakInsertSQL);bakps.setString(1, syncherr);bakps.execute();bakconn.commit();} catch (Exception e) {e.printStackTrace();} finally {// 备库连接释放if (bakps != null) {try {bakps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public void synch(String synchtablenames) throws Exception {HashMap<String, String> synProperty = PropertyUtil.getAllMessage();// 数据库连接参数DataSourceConnectDBVO maindb = new DataSourceConnectDBVO();maindb.setDataSourceType(0);maindb.setDataSourceName("maindb"+synchtablenames);maindb.setAccessMethod(0);maindb.setDataSourceAddress(synProperty.get("maindb.address"));maindb.setDataSourcePort(Integer.parseInt(synProperty.get("maindb.port")));maindb.setDatabaseName(synProperty.get("maindb.databasename"));maindb.setAccountName(synProperty.get("maindb.accountname"));maindb.setAccountPwd(synProperty.get("maindb.accountpwd"));DataSourceConnectDBVO bakdb = new DataSourceConnectDBVO();bakdb.setDataSourceType(0);bakdb.setDataSourceName("bakdb"+synchtablenames);bakdb.setAccessMethod(0);bakdb.setDataSourceAddress(synProperty.get("bakdb.address"));bakdb.setDataSourcePort(Integer.parseInt(synProperty.get("bakdb.port")));bakdb.setDatabaseName(synProperty.get("bakdb.databasename"));bakdb.setAccountName(synProperty.get("bakdb.accountname"));bakdb.setAccountPwd(synProperty.get("bakdb.accountpwd"));int currows = Integer.parseInt(synProperty.get("synchrows"));// 每次同步的记录数// 同步表名.String synchtablenamestmp=synProperty.get(synchtablenames);if(synchtablenamestmp==null||"".equals(synchtablenamestmp)){return;}String[] tableNames = synchtablenamestmp.split(",");for (int t = 0; t < tableNames.length; t++) {String tableName = tableNames[t];// 获取同步字段名List<TableFieldVO> list = DataBaseUtil.getFieldsForTable(tableName,maindb);String fields = "`"+list.get(0).getColumnName()+"`";String values = "?";String idfield="";int paraCount = list.size();for (int i = 1; i < paraCount; i++) {String columnName=list.get(i).getColumnName();fields = fields + ",`" + columnName+"`";values = values + ",?";if("id".equals(columnName.toLowerCase())){idfield=columnName;}}Connection mainconn = null;PreparedStatement mainps = null;ResultSet mainrs = null;Connection bakconn = null;PreparedStatement bakps = null;int curpage = 1;// 第几页,默认显示第1页long startTime = System.currentTimeMillis();String mainQuerySQL = "";String bakInsertSQL ="";while (true) {try {String orderby="".equals(idfield)?"":" order by "+idfield+" ";String limit = orderby+" limit " + (curpage - 1) * currows + ","+ currows;mainQuerySQL = "select * from " + tableName + limit;bakInsertSQL = "insert ignore into " + tableName + " ("+ fields + ") values (" + values + ")";// 主库mainconn = DataBaseUtil.getMySQLConnect(maindb);mainps = mainconn.prepareStatement(mainQuerySQL);mainrs = mainps.executeQuery();// 被库bakconn = DataBaseUtil.getMySQLConnect(bakdb);bakps = bakconn.prepareStatement(bakInsertSQL);int querySize = 0;while (mainrs.next()) {querySize++;for (int i = 0; i < paraCount; i++) {bakps.setString(i + 1, mainrs.getString(list.get(i).getColumnName()));}bakps.addBatch();}if (querySize == 0) {break;}curpage++;bakps.executeBatch();bakconn.commit();this.addSynchLog(bakconn, tableName, mainQuerySQL, "",(System.currentTimeMillis() - startTime) + "");} catch (Exception e) {e.printStackTrace();this.addSynchLog(bakconn, tableName, mainQuerySQL,StringUtil.getExceptionAllinformation(e),(System.currentTimeMillis() - startTime) + "");break;} finally {// 主库连接释放if (mainrs != null) {try {mainrs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (mainps != null) {try {mainps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (mainconn != null) {ConnectionPoolManager.getInstance().release(mainconn);}// 备库连接释放if (bakps != null) {try {bakps.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (bakconn != null) {ConnectionPoolManager.getInstance().release(bakconn);}}}System.out.println(tableNames.length + "/" + t + "表" + tableName+ "耗时:" + (System.currentTimeMillis() - startTime) + "毫秒");}}public static void main(String[] args) throws Exception {new SynchThread("synchtablenames1").start();new SynchThread("synchtablenames2").start();new SynchThread("synchtablenames3").start();}}
二、数据库同步多线程实现
package com.zrscsoft.synchtool.db;public class SynchThread extends Thread {private String synchtablenames;public SynchThread(String synchtablenames) {this.synchtablenames = synchtablenames;}public void run() {if(synchtablenames==null||"".equals(synchtablenames)){return;}SynchMain main = new SynchMain();try {main.synch(synchtablenames);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
三、配置文件及读取配置文件代码
配置文件内容为:
#主库
maindb.address=localhost
maindb.port=3306
maindb.databasename=mysqlmain
maindb.accountname=root
maindb.accountpwd=root
#备库
bakdb.address=localhost
bakdb.port=3306
bakdb.databasename=mysqlbak
bakdb.accountname=root
bakdb.accountpwd=root
#同步表名,多张表以,分开
synchtablenames1=sys_user1
synchtablenames2=sys_user2
synchtablenames3=sys_user3
#每次同步记录数
synchrows=10000
读取配置文件的Java类为:
package com.zrscsoft.synchtool.util;import java.util.Enumeration;
import java.util.HashMap;
import java.util.ResourceBundle;public class PropertyUtil {public static HashMap<String, String> getAllMessage() {String propertyName = "synch";// 获得资源包ResourceBundle rb = ResourceBundle.getBundle(propertyName.trim());// 通过资源包拿到所有的keyEnumeration<String> allKey = rb.getKeys();// 遍历key 得到 valueHashMap<String, String> valList = new HashMap<String, String>();while (allKey.hasMoreElements()) {String key = allKey.nextElement();String value = (String) rb.getString(key);valList.put(key, value);}return valList;}
}
运行方式为:执行SynchMain.java类中的main()方法。
源码和具体的使用细则,可以到下载源码及使用说明请添加链接描述 。
转载于:https://blog.51cto.com/1681229/2370801
MySQL数据库同步小工具(Java实现)相关推荐
- 用 C# 写一个 Redis 数据同步小工具
用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一 ...
- 38个MySQL数据库的小技巧
1.如何快速掌握MySQL? 培养兴趣 兴趣是最好的老师,不论学习什么知识,兴趣都可以极大地提高学习效率.当然学习MySQL 5.6也不例外. 夯实基础 计算机领域的技术非常强调基础,刚开始学习可能还 ...
- 一个可以编辑sqlite数据库的 数据库编辑小工具 sqlite数据库 替换字段,sql替换数据库中某个字段的所有值
一个可以编辑sqlite数据库的 数据库编辑小工具,由于showdoc是不支持mysql数据库的,而我们需要去修改部分数据的时候需要用到sqlite数据库工具,因此这里推荐这个轻量工具: DB.Bro ...
- ExcelToMySQL-批量导入Excel文件到MySQL数据库的自动化工具
ExcelToMySQL:批量导入Excel文件到MySQL数据库的自动化工具 简介 ExcelToMySQL 是一个可以批量导入excel到数据库(mysql/oracle/sqlserver)的自 ...
- mysql数据库同步时间_MySQL 数据库同步
简明现代魔法 -> 数据库技术 -> MySQL 数据库同步 MySQL 数据库同步 2010-01-15 MySQL 的数据同步,在 MySQL 官方网站文档上,叫 Replicatio ...
- 写了个MySQL数据备份小工具,放出来跟大家分享一下,欢迎拍砖。
自己写了个MySQL数据备份小工具,放出来跟大家分享一下,欢迎拍砖. 因为数据库中有blob类型的字段,用SQLyog等工具备份出的脚本都是乱码,没办法导入,可是又经常要备份MySQL数据库,以前一直 ...
- MySQL数据库同步神器 - Gravity - 比Datax好用
MySQL数据库同步神器 - Gravity 原始地址:https://github.com/moiot/gravity 同步地址: https://gitee.com/yunwisdoms/gra ...
- php mysql数据库同步_实现MySQL数据库同步实例演示_MySQL
本次实验的主要目的是剖析配置MySQL(和PHP搭配之最佳组合) 数据库的主辅MySQL数据库同步的实际操作步骤,我前两天在相关网站看见的资料,觉得挺好,就拿出来供大家分享,开始具体的配置. 本次试验 ...
- dmb mysql_DMB(For MySQL)数据库监控备份工具
因为初学Python, 花费了几个礼拜的周末休息时间, DMB的雏形已经出来, 并提供下载使用(适合新手和偷懒的人高手跳过),有Bug和建议请及时发聩给我. 因为是初学,在编写DMB的时候,当中遇到一 ...
最新文章
- ubuntu 16.0.4 opencv 4.0.0 + opencv_contrib 4.0.0 cmake-gui 安装
- 荣品瑞星微RK3399-RP3399开发板
- Spring分布式事务实现
- Java 8 HashMap键与Comparable接口
- Python 匿名函数 lambda - Python零基础入门教程
- php引号变量_下列PHP数据库insert语句中变量前后的点和双引号有什么作用?
- IBM将发布以固态硬盘为基础的全企业系统
- IOS应用程序发布到苹果APP STORE完整流程使用教程
- 加密钱包和借记卡提供商Swipe即将发布V2版本
- CherryPy上传文件
- 鸟哥的linux私房菜-服务器架设篇 读书笔记
- Spatial Transformer Networks(STN)-代码实现
- Jupyter Notebook 快捷键、安装主题、修改颜色、设置字体、注释斜体修改
- 数学分析对计算机有帮助吗,计算机辅助数学分析教学的好处
- 计算机图形学入门(十五)-光线追踪(辐射度量学)
- IIC驱动0.96寸OLED屏幕显示(51单片机)
- Android视频资源下载链接
- 脚本链接 ssh 自动输入密码
- oracle workflow test,oracle workflow常见问题的解决方案
- 什么是管理能力?如何提高管理能力?HR人才测评
热门文章
- cpu飙升 死循环_java排查一个线上死循环cpu暴涨的过程分析
- python作业网站_python大作业
- 6 不更新无法使用_win10更新后无线网络无法使用
- linux 初始化数组,c – 使用initializer_list初始化数组?
- linux java aptget_apt-get没有安装任何linux服务器
- 对linux内核学习的一点感受,对linux内核学习的一点感受
- linux 挂载u盘区别不到,linux系统下为什么不能挂载U盘
- pci中断号分配_西门子S7-200 SMART中断及中断指令概述
- 黑苹果找不到触控板_苹果App内测找不到苹果企业签名怎么办?
- 【杂谈】有三AI专栏作者邀请,在这里写文章能获得什么,有什么不同?