PostgreSQL HA cluster java端實現數據庫讀寫分離

前面文章構建了PostgreSQL HA集羣,那問題來了:如何在Java程序端實現對數據庫的讀操作和寫操作分離?

即:主庫負責處理事務性的增刪改操作,從庫負責處理查詢操作,從而實現讀寫分離的操作。通過讀寫分離,就可以降低單臺數據庫的訪問壓力, 提高訪問效率,也可以避免單機故障。

在項目中,如何通過Java 代碼來完成讀寫分離呢,如何在執行SELECT的時候查詢從庫,而在執行INSERT、UPDATE、DELETE的時候,操作主庫呢?這個時候,我們就需要介紹一個新的組件: ShardingJDBC。

1.關於ShardingJDBC

Sharding-JDBC定位爲輕量級Java框架,在Java的JDBC層提供的額外服務。它使用客戶端直連數據庫,以jar包形式提供服務,無需額外部署和依賴,可理解爲增強版的JDBC驅動,完全兼容JDBC和各種ORM框架。

Sharding-JDBC具有以下幾個特點:

適用於任何基於JDBC的ORM框架

JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

 

支持任何第三方的數據庫連接池

 

DBCP, C3P0, BoneCP, Druid, HikariCP等。

 

支持任意實現JDBC規範的數據庫

 
目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標準的數據庫。

2、pom 依賴:

<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
接下來我們就做一個小案例,首先我們要把我們MySQL主從複製配置,教程在開篇已經提供給各位了。

3、入門案例
首先我們要在項目pom 文件中引入依賴。

<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
View Code

然後在yml 文件中配置數據源。

# 配置服務器
server:
  port: 8081 # 配置端口號
spring:
  shardingsphere:
    datasource:
      names:
        master,slave # 數據源的名稱master,slave是可以隨意定義的,不是固定的
      # write主數據源:for save,update,delete
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.postgresql.Driver
        url: jdbc:postgresql://129.184.13.*:5000/postgres
        username: postgres
        password: postgres
      # read從數據源:only for select
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.postgresql.Driver
        url: jdbc:postgresql://129.184.13.*:5001/postgres
        username: postgres
        password: postgres
    masterslave:
      # 讀寫分離配置
      load-balance-algorithm-type: round_robin #輪詢 如果有多個從庫,從庫的負載均衡策略
      # 最終的數據源名稱
      name: dataSource
      # 主庫數據源名稱
      master-data-source-name: master #主庫數據庫名稱
      # 從庫數據源名稱列表,多個逗號分隔
      slave-data-source-names: slave #從庫數據庫名稱
    props:
      sql:
        show: true #開啓SQL顯示,默認false
  main:
    allow-bean-definition-overriding: true # 允許如果當前項目中存在同名的bean,後定義的bean會覆蓋先定義的
mybatis-plus:
  configuration:
    #在映射實體或者屬性時,將數據庫中表名和字段名中的下劃線去掉,按照駝峯命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID
mybatis:
  #config-location: classpath:mybatis/mybatis-config.xml #指定全局配置文件位置
  mapper-locations: classpath:mapper/*.xml #指定sql映射文件位置
  configuration:
    map-underscore-to-camel-case: true #設置爲列名允許映射駝峯命名法
View Code

 

4、測試

我們使用shardingjdbc來實現讀寫分離,直接通過上述簡單的配置就可以了。

配置完畢之後,我們就可以重啓服務,通過postman來訪問controller的方法,來完成用戶信息的增刪改查,我們可以通過debug及日誌的方式來查看每一次執行增刪改查操作,使用的是哪個數據源,連接的是哪個數據庫。

4.1 增加

 從控制檯輸入日誌看,它確實做的是主庫master

 

 4.2 刪除

 

控制檯輸出日誌,可以看到操作master主庫:

 

 4.3 修改

 控制檯輸出日誌,可以看到操作master主庫:

 

 4.4 查詢

 控制檯輸出日誌,可以看到操作slave從庫:

 

 

 

ps:

Sharding-JDBC官方地址

轉載自:https://blog.csdn.net/weixin_53041251/article/details/126985331

 

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