mysql实现读写分离自带java驱动

2023-10-31

MySQL 数据库的读写分离和负载均衡一般是通过第三方软件来实现的。 也可以通过mysql驱动程序来实现,如com.mysql.jdbc.ReplicationDriver。
官网网址:
多主机连接配置
1.主备配置 2.负载连接配置 3.主从复制链接配置 4.高级负载和主备配置
如下为java实现读写分离demo
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.21</version>
        </dependency>

package jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Properties;

import com.mysql.jdbc.ReplicationDriver;

public class MasterSlaveTest {

    public static void main(String[] aa) throws Exception{
          ReplicationDriver driver = new ReplicationDriver();
          Properties props = new Properties();
          // 对slave自动重连
          props.put("autoReconnect", "true");
          //slaves 负载
          props.put("roundRobinLoadBalance", "true");
          //用户 密码
          props.put("user", "root");
          props.put("password", "abc123");
          //jdbc:mysql:replication://master,slave1,slave2,slave3/test
          Connection conn =driver.connect("jdbc:mysql:replication://192.168.0.109:3306,192.168.0.110:3306/test_db",props);
          //master 进行读写
          conn.setReadOnly(false);
          conn.setAutoCommit(false);
          conn.createStatement().executeUpdate("insert into tmp(a,b)values(11,22)");
          conn.commit();
          //slave 只读
          conn.setReadOnly(true);
          ResultSet rs = conn.createStatement().executeQuery("SELECT count(1) FROM tmp");
          if(rs.next()){
              System.out.println(rs.getInt(1));
          }
          rs.close();
          conn.close();
    }
}
原理: 使用mysql驱动自带的replicationDriver来实现,replicationDriver简单来说就是存在两个Connection,一个masterConnection,一个slaveConnection;当setReadonly(true)就把currentConnection=slaveConnection,反之设置为masterConnection
除此之外,ReplicationDriver还提供负载均衡,双master,下面我们通过代码演示。
<dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

package jdbc;

import java.sql.Connection;
import java.sql.ResultSet;

import org.apache.commons.dbcp.BasicDataSource;

public class LoadbalanceTest {

    public static void main(String[] aa) throws Exception{
        //数据库连接池
        BasicDataSource ds = new BasicDataSource(); 
        ds.setUrl("jdbc:mysql:loadbalance://192.168.0.109:3306,192.168.0.110:3306/test_db");
        ds.setDriverClassName("com.mysql.jdbc.ReplicationDriver");
        ds.setUsername("root");
        ds.setPassword("abc123");

        ds.setInitialSize(3); // 初始的连接数;
        ds.setMaxActive(10);
        ds.setMinIdle(3);
        ds.setMaxIdle(5);
        ds.setMaxWait(3000);
        ds.setRemoveAbandoned(true);
        ds.setRemoveAbandonedTimeout(2000);
        for(int i=0;i<20;i++){
            Connection connection = ds.getConnection();
            connection.setReadOnly(true);//设置为只读,代理类将会获取Slave数据库连接,否则设置Master连接  
            ResultSet rs = connection.createStatement().executeQuery("SELECT count(1) FROM tmp");
            if(rs.next()){
                  System.out.println(rs.getInt(1));
              }
            rs.close();
            connection.close();
        }
    }
}
针对于replicationDriver spring和mybatis集成配置如下
## 使用ReplicationDriver而不是driver
jdbc.driverClassName=com.mysql.jdbc.ReplicationDriver 
## 使用的是jdbc:mysql:replication://
jdbc.url=jdbc:mysql:replication://master:3306,slave1:3306,slave2:3306/test2?characterEncoding=utf8 
jdbc.username=root
jdbc.password=123456
使用spring的事物,把读操作设置为readonly=true
<!-- 配置dataSource -->
  <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
id="dataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.url}"></property>
  </bean> 
  
  <!-- transaction configuration-->
   <bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
  </bean> 
  
  <!-- 定义事务通知 -->  
<tx:advice id="txAdvice" transaction-manager="transactionManager">  
    <!-- 定义方法的过滤规则 -->  
    <tx:attributes>  
        <!-- 所有方法都使用事务 -->  
        <tx:method name="*" propagation="REQUIRED"/>  
        <!-- 定义所有get开头的方法都是只读的 -->  
        <tx:method name="get*" read-only="true"/>  
    </tx:attributes>  
</tx:advice>  
  
<!-- 定义AOP配置 -->  
<aop:config>  
    <!-- 定义一个切入点 -->  
    <aop:pointcut expression="execution (* com.test.service.*.*(..))" id="services"/>  
    <!-- 对切入点和事务的通知,进行适配 -->  
    <aop:advisor advice-ref="txAdvice" pointcut-ref="services"/>  
</aop:config>  
  
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="/WEB-INF/conf/mybatis-config.xml" />
  </bean>
————————————————
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql实现读写分离自带java驱动 的相关文章

  • Swin-Unet:Swin Transformer在医学分割上的首次尝试

    Swin Unet Swin Transformer在医学分割上的首次尝试 前言 最近小编主要在搞一些医学图像分割的工作 也跑了一下Swin Unet 之前看到也看到过这篇Swin Unet 其实五月份就看到了hhhh 决定搬运过来 实际上
  • 前端报错500

    后台代码错误无法返回值 检查后台代码
  • log4j:WARN No appenders could be found for logger 的解决方法

    一 SSH在使用Log4j进行日志管理时常会遇到这个异常 log4j WARN No appenders could be found for logger org springframework web context ContextLo
  • STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一 SHT30温湿度传感器原理图 二 代码部分 1 SHT30 c文件 2 SHT30 h文件 总结 前言 SHT30是一种常见的温湿度传感器 该传感器广泛应用于各种场景 小米的温湿度传感器就是使用的SHT30 本文是已硬件
  • java Consumer接口与示例

    目录 一 consumer使用 示例代码1 示例代码2 示例代码3 示例代码4 二 BiConsumer使用 示例代码一 示例代码二 三 其他和Consumer相关的接口 Java 8 中的 Consumer 是一个函数接口 它可以接受一个
  • opc matlab gui,OPC Server/Client Demo

    Hi thanks a lot for posting this app I m a student and my assignment is to create a simple OPC client server application
  • 牛顿法/递归法实现开方的函数功能

    Filename sqrt method cpp Description Version 1 0 Created 12 27 2016 03 15 18 PM Revision none Compiler gcc Author YOUR N
  • 英语口语413之每日二十个英语单词

    2020 09 01每日二十个英语单词 synchronization 同步化 synchronization multiprocessor 多处理器同步化 synchronized multimedia integration langu
  • buctoj-python 2022.6.19

    A 对指定r计算圆的面积 题目描述 编写函数getCircleArea 对给定的参数r计算圆的面积 并返回 首先读入n n gt 0 然后依次读入n个半径r1 r2 rn 以这些半径为参数依次调用getCircleArea函数 得到对应圆的
  • 管理员权限运行批处理的几种方法

    废话不说 解决win7运行批处理出错不能注册dll等问题 1 在批处理的第一行加入 cd d dp0 然后在批处理上右键选择使用管理员权限运行 2 右键任务栏 选择资源管理器 进程选项卡 显示所有用户的进程 结束explorer 文件 新建
  • HJ59 找出字符串中第一个只出现一次的字符

    描述 找出字符串中第一个只出现一次的字符 数据范围 输入的字符串长度满足 1 le n le 1000 1 n 1000 输入描述 输入一个非空字符串 输出描述 输出第一个只出现一次的字符 如果不存在输出 1 示例1 输入 asdfasdf
  • linux下查看文件大小:ls或du

    方法1 ls lh 参数解释 l 除文件名称外 亦将文件型态 权限 拥有者 文件大小等资讯详细列出 h human readable 与 l 一起 以易于阅读的格式输出文件大小 例如 1K 234M 2G t 文件显示以修改时间排序 最新修

随机推荐

  • Android 中的CreatePackageContext()

    http blog csdn net wangbole article details 22876179 java view plain copy print Return a new Context object for the give
  • Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图

    效果图 opencv人脸识别效果图 请叫我真爱粉 先看一下效果图勾起你的兴趣 文章目录 一 环境配置搭建 二 图像 1 图像读取与显示 main cpp 运行结果 2 图像色彩空间转换 2 1 换色彩 test h test cpp mai
  • nginx location proxy_pass后面加不加/的区别

    以下是通过运行两个nginx测试的结果 通过查看访问日志得到 其中第一行为访问第一个nginx 172 16 78 5 时的地址 然后第一个nginx反向代理第二个nginx 172 16 30 59 分别在第一个nginx修改locati
  • Linux:shell脚本 正则表达式与AWK

    目录 一 正则表达式 1 2元字符 1 3表示次数 1 4位置锚定 1 5分组或其他 1 6扩展正则表达式 1 7grep 二 AWK awk F 编辑三 sed 1 sed简介 2 sed工作流程 3 sed命令格式 3 1打印全部内容
  • Redis学习笔记

    Redis第一天 一 NoSQL数据库介绍 NoSQL表示不仅仅是SQL 泛指非关系型数据库 NoSQL不依赖业务逻辑方式存储 而是以简单的key value模式存储 因此大大增加了数据库的扩展能力 不遵循SQL标准 不支持ACID 原子性
  • 一道创新工场面试题详解:共打了多少鱼?

    一道创新工场面试题详解 共打了多少鱼 题目 abcde五人打渔 打完睡觉 a先醒来 扔掉1条鱼 把剩下的均分成5分 拿一份走了 b再醒来 也扔掉1条 把剩下的均分成5份 拿一份走了 然后cde都按上面的方法取鱼 问他们一共打了多少条鱼 解法
  • vue中 布尔值改为字符串_父子组件间传递数据,props接收字符串,数字,数组,对象,布尔值...

    问题 vue父组件如何向子组件中传递数据 可以分为 静态传递 或者 使用 v bind动态传递 例如 给 prop 传入一个静态的值 也知道 prop 可以通过 v bind 动态赋值 例如 在上述两个示例中 我们传入的值都是字符串类型的
  • 参考

    讲道理 就很离谱 一开始我升级了 Win11 后 突然发现 移动热点 开不了了 就是那种 开了之后 手机 ipad 能检测到电脑移动热点的信号 但是会出现这两种情况 死活连不上 连上了 在移动端显示 无互联网连接 解决办法 打开 移动热点
  • C++基础入门(一)

    C 基础入门 一 0 写在前面 如果你是期末时间紧张冲刺型选手 请移步 C 期末复习超详细总结知识点 期末冲刺 如果你是时间充足型选手 请按顺序依次学习 本篇笔记视频讲解地址 https www bilibili com video BV1
  • c++桶排序(刚学也能看懂)

    目录 哈喽 穿梭门 效果 桶排序是什么 再简单点说 再再简单点说 思路 确定 分桶 个数 复杂度分析 c 代码实现 python版代码 嘿嘿 没想到吧 最后 哈喽 这次来发一下桶排序 它的时间复杂度低 代码也不难 穿梭门 二分算法 堆排序
  • 对于日访问量达到1W IP的处理方法

    转自 http www java123 net 56026 2 html 对于日访问量达到1W IP的处理方法 一 1万ip真是不高 1 常用数据用缓存 减轻数据库压力 2 详细页数据生成静态页面 二 10000算是相当小的了 不需要什么特
  • 同一台服务器上部署多个Tomcat

    同一台服务器上部署多个Tomcat 一 下载Tomcat安装包 进入Tomcat的官网 http tomcat apache org 选择要下载的Tomcat的版本 点击进入 特别说明一下要安装Tomcat9的话 JDK需要在1 8版本以上
  • 饥荒专用服务器全图显示代码,饥荒开全图代码

    用记事本打开游戏目录 data DLC0001 scripts prefabs player common lua文件 在inst AddComponent resurrectable 下一行插inst AddComponent resur
  • 一名计算机专业渣渣的2019春招求职经历—(成功收割华为、浦发、新华三、宝信软件offer)

    写在前面 不经一番彻骨寒 哪得梅花扑鼻香 不管你是谁 不管你是已经20届即将求职的雄鹰 还是19届未能成功入职的弃婴 也或是你是经历了考研失败后才意犹未尽地开始参加春招 都OK 一切都是从零开始 什么时候都不算晚 从刚开始得知自己考研失败
  • DOM 2 级事件的认识

    DOM中的事件是一个很中要的东西 它可以让用户和浏览器之间进行交互 以此来实现人机交互效果 DOM事件 DOM事件分为DOM0级事件和DOM2级事件 DOM0级其实不存在 我们把DOM最初的版本叫0级 在DOM2级的时候更新了一种新的事件绑
  • 亿级Web系统搭建——单机到分布式集群

    徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作 负责过日请求量过亿的Web系统升级与重构 目前在小满科技创业 从事SaaS服务技术建设 大规模流量的网站架构 从来都是慢慢 成长 而来 而这个过程中 会遇到很多问题 在不断解决问题的过程中
  • 外企程序员常用英语单词

    1 cognitive k n t v adj 认知的 认识的 2 risk r sk n 风险 危险 冒险 vt 冒 的危险 n Risk 人名 英 阿拉伯 里斯克 3 berries beriz 浆果类 4 vegetables ved
  • Mac使用经验分享 - 总览

    Mac本身支持的效率操作 各种快捷键的使用 Mac系统本身支持很多的快捷键 这些快捷键能够很大程度的提升使用效率 在此处简单列出一些我经常使用的快捷键 权作参考 W 关闭当前窗口 M 最小化当前窗口 W 关闭所有finder窗口 有一个fi
  • LLVM介绍

    文章目录 LLVM介绍 一 LLVM三段式架构 1 传统编译器的三段式 2 LLVM的三段式 二 Clang与LLVM的关系 三 LLVM 编译流程 LLVM介绍 在理解LLVM时 我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM
  • mysql实现读写分离自带java驱动

    MySQL 数据库的读写分离和负载均衡一般是通过第三方软件来实现的 也可以通过mysql驱动程序来实现 如com mysql jdbc ReplicationDriver 官网网址 多主机连接配置 1 主备配置 2 负载连接配置 3 主从复