双数据源同步的思考

双数据源同步的思考

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.简单实现
    • 2.Spring+ mybatis 技术
  • 参考资料和推荐阅读

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述
在这里插入图片描述

概述

当需要将数据从一个数据源同步到另一个数据源时,可以采用以下方法和步骤:

方法:

  1. 手动同步:通过编写脚本或使用工具进行手动数据同步。
  2. 定时任务:设置定时任务,定期执行数据同步操作。
  3. 数据库触发器:使用数据库触发器监测源数据的变化,并实时同步到目标数据源。
  4. 数据同步工具:使用专业的数据同步工具,如Sqoop、DataX等。

步骤:

  1. 确定源数据源和目标数据源的连接信息,包括数据库类型、主机地址、端口号、用户名、密码等。
  2. 创建目标数据源的表结构,确保与源数据源的表结构一致或可以映射。
  3. 根据需求,选择合适的同步方法(手动同步、定时任务、数据库触发器或数据同步工具)并实施。
  4. 编写数据同步脚本或配置数据同步工具,设置正确的数据源连接信息和同步规则。
  5. 执行数据同步操作,验证数据是否成功同步到目标数据源。
  6. 监测同步过程中的错误和异常情况,并及时处理。
  7. 定期检查同步结果,确保数据持续同步且一致性良好。
  8. 根据实际情况,优化数据同步的性能和稳定性,例如调整同步频率、优化SQL查询语句等。

那我们用程序怎么写呢?

需求:

设计思路

实现思路分析

1.简单实现

以下是一个示例的Java代码,用于将数据从一个数据源同步到另一个数据源:

import java.sql.*;

public class DataSync {

    public static void main(String[] args) {
        // 数据源1的连接参数
        String sourceUrl = "jdbc:mysql://localhost:3306/source_database";
        String sourceUsername = "root";
        String sourcePassword = "password";

        // 数据源2的连接参数
        String targetUrl = "jdbc:mysql://localhost:3306/target_database";
        String targetUsername = "root";
        String targetPassword = "password";

        // 同步数据的SQL查询
        String query = "SELECT * FROM source_table";

        try (
            // 创建数据源1的连接
            Connection sourceConnection = DriverManager.getConnection(sourceUrl, sourceUsername, sourcePassword);
            // 创建数据源2的连接
            Connection targetConnection = DriverManager.getConnection(targetUrl, targetUsername, targetPassword);
            // 创建数据源1的查询语句
            Statement sourceStatement = sourceConnection.createStatement();
            // 创建数据源2的插入语句
            Statement targetStatement = targetConnection.createStatement();
            // 执行数据源1的查询语句,并获取结果集
            ResultSet resultSet = sourceStatement.executeQuery(query)
        ) {
            // 遍历结果集
            while (resultSet.next()) {
                // 获取每一行数据的字段值
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                // 可以根据需要获取其他字段的值

                // 在数据源2中插入同步的数据
                String insertQuery = "INSERT INTO target_table (id, name) VALUES (" + id + ", '" + name + "')";
                targetStatement.executeUpdate(insertQuery);
            }

            System.out.println("数据同步完成!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

请根据实际情况修改连接参数和SQL查询语句,确保正确连接到两个数据源,并适应要同步的数据表和字段名称。

**

2.Spring+ mybatis 技术

**
在Spring Boot中,你可以使用MyBatis作为持久层框架,来实现从一个数据源将数据同步到另一个数据源。

首先,需要在pom.xml文件中添加MyBatis和相关的数据库驱动依赖:

<dependencies>
    <!-- MyBatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
    <!-- 数据库驱动 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

然后,在application.properties文件中配置两个数据源的连接信息:

# 第一个数据源
spring.datasource.url=jdbc:mysql://localhost:3306/source_db
spring.datasource.username=source_user
spring.datasource.password=source_password

# 第二个数据源
spring.target-datasource.url=jdbc:mysql://localhost:3306/target_db
spring.target-datasource.username=target_user
spring.target-datasource.password=target_password

接下来,创建两个数据源的配置类DataSourceConfig和TargetDataSourceConfig:

@Configuration
@MapperScan(basePackages = "com.example.source.mapper", sqlSessionTemplateRef = "sourceSqlSessionTemplate")
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource sourceDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory sourceSqlSessionFactory(DataSource sourceDataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(sourceDataSource);

        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sourceSqlSessionTemplate(SqlSessionFactory sourceSqlSessionFactory) {
        return new SqlSessionTemplate(sourceSqlSessionFactory);
    }
}

@Configuration
@MapperScan(basePackages = "com.example.target.mapper", sqlSessionTemplateRef = "targetSqlSessionTemplate")
public class TargetDataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.target-datasource")
    public DataSource targetDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory targetSqlSessionFactory(DataSource targetDataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(targetDataSource);

        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate targetSqlSessionTemplate(SqlSessionFactory targetSqlSessionFactory) {
        return new SqlSessionTemplate(targetSqlSessionFactory);
    }
}

然后,定义两个数据源对应的Mapper接口和SQL语句,分别在com.example.source.mapper和com.example.target.mapper包中。

最后,创建一个服务类SyncService,在这个类中使用两个数据源的Mapper接口来实现数据同步的逻辑:

@Service
public class SyncService {
    @Autowired
    private SourceMapper sourceMapper;

    @Autowired
    private TargetMapper targetMapper;

    public void syncData() {
        List<SourceData> sourceDataList = sourceMapper.getAllData();

        // 将sourceDataList同步到target数据源中
        for (SourceData sourceData : sourceDataList) {
            targetMapper.insertData(sourceData);
        }
    }
}

最后,在Spring Boot的启动类中添加@EnableAutoConfiguration注解和@EnableScheduling注解,用于自动配置和调度任务:

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这样,每次启动应用程序时,都会自动执行数据同步的任务。

以上就是使用Spring Boot和MyBatis进行数据从一个数据源同步到另一个数据源的方法。你可以根据自己的实际需求进行修改和扩展。

参考资料和推荐阅读

参考资料
官方文档
开源社区
博客文章
书籍推荐
1.https://www.jb51.net/article/258781.htm
2.https://blog.csdn.net/weixin_44735933/article/details/123061281
3.https://blog.csdn.net/m0_64136740/article/details/129517492

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!同时,期望各位大佬的批评指正~,如果有兴趣,可以加文末的交流群,大家一起进步哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/341419.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

geemap学习笔记053:纹理特征

前言 纹理特征通常描述了遥感影像中像素之间的空间关系和变化&#xff0c;对于地物分类、目标检测以及图像分割等遥感应用非常有价值。本节将会介绍Earth Engine中提供的一些纹理特征计算方法&#xff0c;包括熵和灰度共生矩阵。 1 导入库并显示数据 import ee import geema…

.NET发展如火如荼,这回.Net 8的野心确实不小

随着三天.NET Conf 2023的会议结束了&#xff0c;.Net 8正式发布了。 .Net 8是官方号称有史以来性能最快的一个版本了。 .Net 8 增加了数以千计的性能、稳定性和安全性改进&#xff0c;以及平台和工具增强功能&#xff0c;有助于提高开发人员的工作效率和创新速度。 反正就是快…

【Leetcode 965.】判断单值二叉树

单值二叉树&#xff1a; 示例一&#xff1a; 示例二&#xff1a; 代码&#xff1a; bool isUnivalTree(struct TreeNode* root) {if(rootNULL)return true;if(root->left&&root->left->val!root->val)return false;if(root->right&&root-&…

【2024系统架构设计】案例分析- 1软件架构设计

目录 一 基础知识 二 历年真题 案例分析前文回顾: 【2024系统架构设计】 系统架构设计师第二版-大数据架构理论设计与实践 【2024系统架构设计】 系统架构设计师第二版-云原生架构设计理论与实践

opencv#30 线性滤波

均值滤波原理 均值滤波步骤 Step1:求和。 Step2:计算平均值。 所谓均值滤波&#xff0c;就是求平均值的意思。我们假设在一个3*3的范围内有一个图像&#xff0c;其中这个图像每一个像素可能含有噪声&#xff0c;也可能不含噪声&#xff0c;我们是不知道的&#xff0c;因此通…

力扣1143. 最长公共子序列(动态规划)

Problem: 1143. 最长公共子序列 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们先假设已经将两个字符串转换为两个char类型的数组&#xff08;t1,t2&#xff09;便于比较 1.如果t1[i] t2[j],有三种决策&#xff1a;&#xff08;i1&#xff0c;j1&#xff09;&a…

【江科大】STM32:TIM输入捕获(理论部分)

文章目录 IC&#xff08;Input Capture&#xff09;输入捕获PWM频率 知识点补充1. 滤波器的工作原理&#xff1a;2. 边沿检测器&#xff1a;自动化清零CNT输入捕获的基本结构PWMI基本结构滤波器和分频器的区别误差分析pwm.cmain.cIC.c PWM模式测频率和占空比 IC&#xff08;Inp…

架构篇08:架构设计三原则

文章目录 合适原则简单原则演化原则小结 成为架构师是每个程序员的梦想&#xff0c;但并不意味着把编程做好就能够自然而然地成为一个架构师&#xff0c;优秀程序员和架构师之间还有一个明显的鸿沟需要跨越&#xff0c;这个鸿沟就是“不确定性”。 对于编程来说&#xff0c;本…

神经网络算法与逻辑回归:优势与差异

神经网络算法和逻辑回归都是预测模型中的重要工具&#xff0c;但它们在处理复杂和非线性问题时表现出不同的性能。本文将深入探讨神经网络算法相对于逻辑回归的优势&#xff0c;以及它们在不同场景下的适用性。 一、引言 神经网络算法和逻辑回归都是预测模型中的重要工具&…

Ubuntu用gparted重新分配空间

ubuntu系统使用过程中安装系统时预先留的空间不够使用怎么办&#xff1f; 这么办&#xff01; 首先 使用df -h 查看当前空间使用情况 已经分配的空间重新规划 &#xff1f; 先将已分配的空间中的多余空间分离出来&#xff1b; 假设我想将挂载点/home下的一部分空间分给挂载…

数据结构之使用顺序表写出通讯录

前言 昨天我们踏入了数据结构的深山&#xff0c;并且和顺序表battle了一番&#xff0c;虽说最后赢了&#xff0c;但同时也留下了一个问题&#xff1a;如何从顺序表的增删查改加强到通讯录的的增删查改&#xff0c;别急&#xff0c;今天就带你一探究竟。 一.回顾与思考 我们昨…

20.云原生之GitLab CICD实战

云原生专栏大纲 文章目录 GitLab RunnerGitLab Runner 介绍Gitlab Runner工作流程 Gitlab集成Gitlab RunnerGitLab Runner 版本选择Gitlab Runner部署docker-compose方式安装kubesphere中可视化方式安装helm方式安装 配置gitlab-runner配置gitlab-ci.ymlgitlab-ci.yml 介绍编写…

i18n多国语言Internationalization的动态实现

一、数据动态的更新 在上一篇i18n多国语言Internationalization的实现-CSDN博客&#xff0c;可能会遇到一个问题&#xff0c;我们在进行英文或中文切换时&#xff0c;并没有办法对当前的数据进行动态的更新。指的是什么意思呢&#xff1f;当前app.js当中一个组件内容&#xff…

Docker镜像操作

镜像名称 镜名称一般分两部分组成&#xff1a;[repository]:[tag]。 在没有指定tag时&#xff0c;默认是latest&#xff0c;代表最新版本的镜像。 这里的mysql就是repository&#xff0c;5.7就是tag&#xff0c;合一起就是镜像名称&#xff0c;代表5.7版本的MySQL镜像。 镜像…

基于Java开发的校园失物招领系统详细设计和实现【附源码】

基于Java开发的校园失物招领系统详细设计和实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制…

若依前后台分离vue项目放开前台页面拦截配置

若依前后台分离vue项目放开前台页面拦截配置 使用场景某些页面不需要权限就能直接访问的页面 , 例如做个单点登录之类的。这里只需要修改2处即可 ssologin.vue代码 <template> </template> <script> export default {name: "SsoLogin",data() {r…

软件设计师——软件工程(五)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

怎么提升数据分析能力?——功法篇(下)

先来复习一下上篇提到的3个疑问&#xff1a; 为什么我做出来的分析总觉得没有别人的那么高级&#xff1f; 老板为什么总说我的分析“太浅了”&#xff1f; 数据分析师每天的工作就是取数做需求&#xff1f; 看完上篇讲的金字塔原理&#xff0c;如果你还有疑问&#xff0c;不妨再…

Mac上如何设置映射某个网站站点域名的IP

最近某常用的站点换 IP 了&#xff0c;但是 DNS 服务器还没有修改&#xff0c;这就导致无法访问&#xff08;换 DNS 服务器也不行&#xff09;。在用了一段时间的 IP 访问之后&#xff0c;还是没好&#xff0c;不知道是 DNS 污染还是咋了&#xff0c;所以最后还是手动改一下吧。…

使用Docker部署Apache Superset结合内网穿透实现远程访问本地服务

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…