您的位置:首页 > 数据库 > MySQL

数据源读写分离 -- replication

2017-12-19 19:54 435 查看
MySql给提供了一种简单的读写分离方式–replication,先看下具体的demo.

package test1;

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

import com.mysql.jdbc.Driver;
import com.mysql.jdbc.ReplicationDriver;;

public class ConnectionDemo {

public static void main(String[] args) throws Exception {

ReplicationDriver driver = new ReplicationDriver();
String url = "jdbc:mysql:replication://address=(protocol=tcp)(type=master)(host=masterhost)(port=3306)(user=masteruser),address=(protocol=tcp)(type=slave)(host=slavehost)(port=3306)(user=slaveuser)/yourdb";
Properties props = new Properties();
props.put("password", "yourpassword");
try (Connection conn = driver.connect(url, props))
{
// Perform read/write work on the master
conn.setReadOnly(false);
conn.setAutoCommit(false);
conn.createStatement().executeUpdate("update t1 set id = id+1;");
conn.commit();

// Set up connection to slave;
conn.setReadOnly(true);

// Now, do a query from a slave
try (Statement statement = conn.createStatement())
{
ResultSet res = statement.executeQuery("show tables");
System.out.println("There are below tables:");
while (res.next()) {
String tblName = res.getString(1);
System.out.println(tblName);
}
}
}
}
}


这里只有一点做特殊说明readonly。只有设置成readonly的sql才会使用slave数据源。

现在一般都是跟spring框架集成的,再来看Spring中的集成方式。

application.yml中的配置:

spring:
datasource:
#数据库连接池配置
hikari:
##            等待从连接池中获得连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
connection-timeout: 30000
##            一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
idle-timeout: 600000
##            一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上
max-lifetime: 1765000
pool-name: slave
maximum-pool-size: 50
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:replication://address=(protocol=tcp)(type=master)(host=masterhost)(port=3306)(user=root),address=(protocol=tcp)(type=slave)(host=slavehost)(port=3306)(user=root)/testdb?useUnicode=true&characterEncoding=utf8&useSSL=true&allowMultiQueries=true&verifyServerCertificate=false
#      username: root
password: root


这里配置完之后需要在项目中设置readonly。

@Transactional(readOnly = true)
User findById(int id);


这里借助的是@Transactional注解,我这里选择注解的位置是mapper的接口。

今天看了篇很好的文章,大家可以深入了解下http://www.iteye.com/topic/205926/

官网参考链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息