Springboot + Mybatis 配置主從庫

近期在做一個JAVA項目,需要做Mysql主從配置,因爲之前有接觸過Mysql自己的主從驅動(Replication),因此就這方面做下簡單的分享。

首先是配置,我是Mysql8,因此引入的依賴也就是 mysql-connector-java(8.0.15)配置如下

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.15</version>
	<scope>runtime</scope>
</dependency>

然後是數據庫鏈接配置,這個地方是關鍵。我們原來使用的scheme都是jdbc:mysql,這種只能配置一個數據庫。而mysql官方早幾年前就已經出了一套自己的主從驅動,也就是jdbc:mysql:replication形式。

# 常規鏈接方式
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/temp

# 主從連接方式
spring.datasource.url=jdbc:mysql:replication://MASTER,SLAVES:3306/temp?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=GMT%2B8

# 配置格式 1主多從
jdbc:mysql:replication://[master host][:port],[slave host 1][:port][,[slave host 2][:port]]...[/[database]] »
[?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

它會將所有readonly設置爲true的請求只訪問從庫,其餘的訪問主庫。(我這裏說的不詳細,具體參考請查看官方文檔

那麼如果如何設置我需要走從庫的查詢語句呢?

只需要簡單的設置readonly就好,在你的Mapper.java文件中,對於你認爲應該訪問從庫的類或者方法加上```@Transactional(readOnly = true)```

@Mapper
@Repository
public interface TempMapper {

    /**
     * 查詢語句需要訪問從庫,因此設置爲readonly=true
     */
    @Transactional(readOnly = true)
    List<Temp> selectByExample(TempExample example);

    @Transactional(readOnly = true)
    Temp selectByPrimaryKey(Integer id);

    /**
     * 非查詢語句需要訪問主庫,因此無需設置
     */
    int updateByPrimaryKeySelective(Temp record);

    int insert(Temp record);

    int deleteByPrimaryKey(int id);

    // 有些查詢語句一定要走主庫的,就不要加readonly
    List<Temp> selectFromMaster(TempExample example);
}

也可以定義整個類都是訪問從庫。

@Mapper
@Repository
@Transactional(readOnly = true)
public interface TempMapper {

    List<Temp> selectByExample(TempExample example);

    Temp selectByPrimaryKey(Integer id);
}

我之前使用xml文件配置的mybatis,可以通過方法名直接定義readonly=true,springboot還是不太熟練,沒有想好怎麼搞,等研究透,我再做補充。

大家有啥好的想法,可以留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章