天天看點

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

一、有時候經常會遇到配置資料庫主從主從分離是存儲和通路資料,就需要配置和修改代碼了,mysql安裝我就不說了

二、  主伺服器master的配置

1. vim /etc/my.cnf

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

2. 重新開機服務 service mysqld restart

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

3. 建立一個使用者

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

4. 賦予使用者的權限(mysql之使用者密碼)

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

三、 從伺服器slaver的配置

進入到my.cnf下面 vim /etc/my.cnf

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

2. 另一種重新開機MySQL服務:

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

3. 連接配接到master上

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

4. 從庫上檢視同步狀态

mysql讀寫分離代碼層實作_代碼層讀寫分離實作
mysql讀寫分離代碼層實作_代碼層讀寫分離實作

發現有錯誤

解決:

stop slave 停止主從同步

vim /etc/my.cnf

搜尋server-id發現配置檔案已經預設配置了一個,需要删除檔案自己預設配置的

重新開機服務

打開主從同步start slave

檢視狀态:發現已經沒有錯誤了

四、 代碼層讀寫分離

就是說讀的時候到從資料庫讀,修改的時候到主資料庫修改

1. 建立一個包

mysql讀寫分離代碼層實作_代碼層讀寫分離實作

2. 配置抽象路由資料源DynamicDataSource

packagecom.itwang.o2o.dao.split;importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

//繼承抽象路由資料源public class DynamicDataSource extendsAbstractRoutingDataSource {

@OverrideprotectedObject determineCurrentLookupKey() {returnDynamicDataSourceHolder.getDBType();

}

}

3. 配置DynamicDataSourceHolder

packagecom.itwang.o2o.dao.split;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;public classDynamicDataSourceHolder {private static Logger logger = LoggerFactory.getLogger(DynamicDataSourceHolder.class);//ThreadLocal保證線程安全

private static ThreadLocal contextHolder = new ThreadLocal();public static final String DB_MASTER = "master";public static final String DB_SLAVE = "slave";

public staticString getDBType(){

String db=contextHolder.get();if (db == null){

db=DB_MASTER;

}returndb;

}

public static voidsetDBType(String str){

logger.debug("所使用的資料源為:" +str);

contextHolder.set(str);

}

public static voidclearDBType(){

contextHolder.remove();

}

}

4. 配置mybatis的攔截器,DynamicDataSourceInterceptor

packagecom.itwang.o2o.dao.split;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;public classDynamicDataSourceHolder {private static Logger logger = LoggerFactory.getLogger(DynamicDataSourceHolder.class);//ThreadLocal保證線程安全

private static ThreadLocal contextHolder = new ThreadLocal();public static final String DB_MASTER = "master";public static final String DB_SLAVE = "slave";

public staticString getDBType(){

String db=contextHolder.get();if (db == null){

db=DB_MASTER;

}returndb;

}

public static voidsetDBType(String str){

logger.debug("所使用的資料源為:" +str);

contextHolder.set(str);

}

public static voidclearDBType(){

contextHolder.remove();

}

}

5.配置SqlMapConfig.xml

/p>

PUBLIC"-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

6. 配置dao層資料源配置檔案

6.1 原始配置

6.2 修改後的配置

7. 配置資料庫參數檔案配置db.properties(這裡我主從庫配置的一樣友善測試)

jdbc.driver=com.mysql.jdbc.Driver

jdbc.master.url=jdbc:mysql://localhost:3306/o2o?characterEncoding=UTF-8

jdbc.slave.url=jdbc:mysql://localhost:3306/o2o?characterEncoding=UTF-8

jdbc.username=root

jdbc.password=root