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 还需要了解的扩展知识

有空时应该进一步读一下代码,看看以下一些内容:

  1. Transactional的注解,是怎样逐渐调用到Connection.setReadOnly()的?
  2. 多个Transactional注解的函数调用时,readOnly参数是否会每次都调用?

原文地址:https://www.cnblogs.com/codestory/p/11329017.html

时间: 2024-10-12 04:18:50

Mysql使用ReplicationDriver驱动实现读写分离的相关文章

Mysql主从配置,实现读写分离

大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果更是 不堪设想.这时候,我们会考虑如何减少数据库的联接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.Ok切入今天微博主题,利用MySQL主从配置,实现读写分离,减轻数据库压力.这种

MySQL/MariaDB基于MMM实现读写分离及高可用

前言 MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的). MMM 优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是单点,可以结合Keepal

高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离

点击链接加入群[Dubbo技术交流2群]:https://jq.qq.com/?_wv=1027&k=46DcDFI 一.环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso JDK版本:jdk1.7.0_45 MyCat版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz MyCat节点IP:192.168.1.203      主机名:edu-mycat-01  主机配置:4核CPU.4G内存 MySQL版本:

使用mysql proxy对数据库进行读写分离

服务器安排如下: 192.168.100.128 主 192.168.100.129 从 192.168.100.130 mysql-proxy 1.在100.130中下载安装mysql-proxy tar -zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz cp mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy 2.配置环境变量 LUA_PATH="/usr/local/m

Mysql之主从模式、读写分离概念

MySQL主从架构复制: 在主server上每次进行可能引起数据变化的操作都要先记录到二进制文件中,并将数据同步到主server的磁盘上,与此同时还要通过端口(3306)将二进制日志发送到从server上,在从server上,从server会先将接受的二进制日志保存为中继日志(relay log),在从中继日志中进行读取,重新执行一遍操作,进行数据的复制 但一般来说,如果主server有多个cpu,当数据量变化很频繁时,可能会在每个cpu上都运行一个事务,而注server只能一个个的记录入二进制

MySQL Proxy实现数据的读写分离

做MySQL读写分离实验之前,先要搭建MySQL主从复制,可以参考我之前的两篇文章: MySQL主从配置:http://msiyuetian.blog.51cto.com/8637744/1697288 部署搭建分层次LAMP架构(最后一章节):http://msiyuetian.blog.51cto.com/8637744/1740236 实现了主从复制后,下面我们进行读写分离的安装与配置.环境说明: Linux发行版本:centos 6.7 x86_64 (三台) Hostname IP 备

MySQL深入利用Ameoba实现读写分离

3 ameoba安装配置 ? 3.1 安装配置JDK [[email protected] ~]# rpm -ivh jdk-7u67-linux-x64.rpm [[email protected] ~]# cd /usr/java/ ? 修改环境变量 ? [[email protected] ~]# vim /etc/profile.d/java.sh [[email protected] ~]# cat /etc/profile.d/java.sh export JAVA_HOME=/us

MySQL主从配置及实现读写分离

大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果更是 不堪设想.这时候,我们会考虑如何减少数据库的联接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.Ok切入今天主题,利用MySQL数据库主从配置,实现读写分离,减轻数据库压力.这

mysql双击热备+amoeba读写分离

Mysql读写分离是为了提高网站的访问速度,提高数据库的并发负载能力. 但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力, 这样的方案来进行部署与实施的. 注意:先做主从复制,再度读写分离. MySQL主从复制结构是基于mysql bin-log日志基础上,从库通过打开IO进程收到主库的bin-log