Mysql使用ReplicationDriver驱动实现读写分离
数据库的主从复制环境已经配好,该要解决系统如何实现读写分离功能了。Mysql的jdbc驱动提供了一种实现ReplicationDriver。
1 数据库地址的两种写法
参考:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-url-format.html
因为后续配置可能会用到,先介绍一下mysql url中主机地址的两种写法。
最简单的写法就是 host:port ,如 192.168.5.128:3306,如果端口是缺省的3306,也可以不写,直接使用 192.168.5.128。
更复杂的写法是指定属性,格式为 address=(host=host_or_ip)(port=port)(key1=value1)(key2=value2)...(keyN=valueN),如 address=(host=192.168.5.128)(port=3306)(type=master)。
2 数据池配置
参考:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-master-slave-replication-connection.html
driverClassName: com.mysql.jdbc.ReplicationDriver
url字符串格式:
jdbc:mysql:replication://[master host][:port],[slave host 1][:port][,[slave host 2][:port]]...[/[database]][?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]
数据库地址的写法有两种,上面是第一种简单的写法,ReplicationDriver默认将第一个数据库服务器作为Master库,后续其他数据库服务器作为从数据库。
如果数据库主从设置了多台数据库作为Master,则url格式为:
jdbc:mysql:replication://address=(type=master)(host=master1host),address=(type=master)(host=master2host),address=(type=slave)(host=slave1host)/database[?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]
3 ReplicationDriver的调用方法
Mysql驱动使用究竟使用 master还是 slave数据库,取决于 Connection.getReadOnly()的值。如果值为false,则将命令发送到master数据库,如果值为true,则将命令发送到slave数据库。当有多台slave数据库时,使用轮询调度(round-robin)算法选择某一台slave数据库。
所以,为了让mysql驱动能够准确的将命令发送到master或slave,代码需要在获取到数据连接后,执行命令 Connection.setReadOnly(true) 或 Connection.setReadOnly(false)。
以下是mysql官方提供的示例代码
import java.sql.Connection; import java.sql.ResultSet; import java.util.Properties; import com.mysql.jdbc.ReplicationDriver; public class ReplicationDriverDemo { public static void main(String[] args) throws Exception { ReplicationDriver driver = new ReplicationDriver(); Properties props = new Properties(); // 从库上允许自动重连 props.put("autoReconnect", "true"); // 多台从库使用负载均衡 props.put("roundRobinLoadBalance", "true"); props.put("user", "foo"); props.put("password", "password"); Connection conn = driver.connect("jdbc:mysql:replication://master,slave1,slave2 /test", props); // 在主库上读写,设置 read-only 为 "false" conn.setReadOnly(false); conn.setAutoCommit(false); conn.createStatement().executeUpdate("UPDATE some_table ...."); conn.commit(); // 现在在从库上执行查询,驱动会自动选择一台从库执行查询 conn.setReadOnly(true); ResultSet rs = conn.createStatement().executeQuery("SELECT a,b FROM alt_table"); ....... } } |
4 Spring TX实现读写分离
项目使用Spring Transaction管理事务,注解Transactional已经帮我们做了封装,注解属性 readOnly,缺省为 false。
/** * {@code true} if the transaction is read-only. * Defaults to {@code false}. * <p>This just serves as a hint for the actual transaction subsystem; * it will <i>not necessarily</i> cause failure of write access attempts. * A transaction manager which cannot interpret the read-only hint will * <i>not</i> throw an exception when asked for a read-only transaction. * @see org.springframework.transaction.interceptor.TransactionAttribute#isReadOnly() */ boolean readOnly() default false; |
简单用法
@Transactional(readOnly = true) public List<Enterprise> queryList(EnterpriseCriteria criteria) { return enterpriseDao.queryList(criteria); } |
在现有项目上拉了一个分支,使用VMWare上搭建的MariaDB主从库进行测试,确实能实现读写分离。
5 还需要了解的扩展知识
有空时应该进一步读一下代码,看看以下一些内容:
- Transactional的注解,是怎样逐渐调用到Connection.setReadOnly()的?
- 多个Transactional注解的函数调用时,readOnly参数是否会每次都调用?
Mysql使用ReplicationDriver驱动实现读写分离的更多相关文章
- Mysql主从配置,实现读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- 分布式架构高可用架构篇_08_MyCat在MySQL主从复制基础上实现读写分离
参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...
- 黄聪:Mysql主从配置,实现读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- Mysql 之主从复制,mysql-proxy读写分离
准备两台mysql服务器,master(192.168.43.64).slave(192.168.84.129) master配置: log-bin=mysql-bin binlog_format=m ...
- Mysql多实例安装+主从复制+读写分离 -学习笔记
Mysql多实例安装+主从复制+读写分离 -学习笔记 .embody{ padding:10px 10px 10px; margin:0 -20px; border-bottom:solid 1px ...
- 高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离
实战操作可参考:http://www.roncoo.com/course/view/3117ffd4c74b4a51a998f9276740dcfb 一.环境 操作系统:CentOS-6.6-x86_ ...
- MySQL+MyCat分库分表 读写分离配置
一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件.运行在代码应用和MySQL数据库之间的应用. 前身 : cor ...
- linux上使用amoeba实现MySql集群,以及读写分离,主从复制
一.由于是MySql集群,所以就不可能只有一个MySql,需要多个MySql,具体安装步骤,可以参考http://www.cnblogs.com/ywzq/p/4882140.html这个地址进行安装 ...
- mysql主从复制 主主复制 读写分离
首先是mysql的主从复制很简单 主主复制也就是互相主从最麻烦的最难的就是日志恢复,增量恢复什么的比较复杂 首先如果你不会安装mysql版本最好一样,或者往上的版本,因为mysql是向下兼容 请注意不 ...
随机推荐
- ECAMScript中的let和const
let与const命令都是用来在js中声明变量的,在使用上与var相似,但存在一些区别,下面先讲let同var的区别 let 怎么使用呢,同var一样,let 变量名 就可以声明了 区别一:其作 ...
- Java --Lamda表达式
Lamda:属于函数式编程的概念: interface IMessage { public void print() ; } public class TestDemo { public static ...
- 复习一下KVC
一. 前言 KVC(Key Value Coding)是Cocoa框架为开发者提供的非常强大的工具,简单解释为:键值编码.它依赖于Runtime,在OC的动态性方面发挥了重要作用. 它主要的功能在于直 ...
- [20191003]oracle number类型存储转化脚本.txt
[20191003]oracle number类型存储转化脚本.txt --//完善脚本,增加支持科学记数法.比如1e4之类的写法. 2.测试:$ cat test.txt012251234100-4 ...
- 获取BOM标准用量
Select dbms_aw.eval_number(listagg(' 1' || sys_connect_by_pat ...
- [PHP] 安装PHP报错“Primary script unknown”的解决方法
当安装完最新版的nginx和最新版的PHP以后,使用niginx默认配置文件中的PHP配置会有错误访问指定目录下的php文件时,显示File not found.错误.查看nginx的错误日志显示 9 ...
- CPU与GPU基础知识与品牌
1 CPU信息 ubuntu系统: lscpu 序号 属性 描述 1 架构 x86_64 2 CPU 运行模式 32-bit, 64-bit 3 字节序 Little Endian 4 CPU内核数量 ...
- C学习笔记(6)--- 共用体,位域深入
1.共用体(Union): 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置 ...
- Sqlserver 2014 下载
ed2k://|file|cn_sql_server_2014_enterprise_edition_x64_dvd_3932882.iso|2898847744|A33CE10CD989083D1A ...
- CF812C Sagheer and Nubian Market
CF812C Sagheer and Nubian Market 洛谷评测传送门 题目描述 On his trip to Luxor and Aswan, Sagheer went to a Nubi ...