数据源读写分离 -- replication

来源:互联网 发布:java程序设计流程图 编辑:程序博客网 时间:2024/06/05 17:07

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/,
官网参考链接。

原创粉丝点击