PostgreSQL HA cluster java端實現(xiàn)數(shù)據(jù)庫讀寫分離
前面文章構(gòu)建了PostgreSQL HA集群,那問題來了:如何在Java程序端實現(xiàn)對數(shù)據(jù)庫的讀操作和寫操作分離?
即:主庫負(fù)責(zé)處理事務(wù)性的增刪改操作,從庫負(fù)責(zé)處理查詢操作,從而實現(xiàn)讀寫分離的操作。通過讀寫分離,就可以降低單臺數(shù)據(jù)庫的訪問壓力, 提高訪問效率,也可以避免單機(jī)故障。
在項目中,如何通過Java 代碼來完成讀寫分離呢,如何在執(zhí)行SELECT的時候查詢從庫,而在執(zhí)行INSERT、UPDATE、DELETE的時候,操作主庫呢?這個時候,我們就需要介紹一個新的組件: ShardingJDBC。
1.關(guān)于ShardingJDBC
Sharding-JDBC定位為輕量級Java框架,在Java的JDBC層提供的額外服務(wù)。它使用客戶端直連數(shù)據(jù)庫,以jar包形式提供服務(wù),無需額外部署和依賴,可理解為增強(qiáng)版的JDBC驅(qū)動,完全兼容JDBC和各種ORM框架。
Sharding-JDBC具有以下幾個特點:
| 適用于任何基于JDBC的ORM框架 |
JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。 |
|
支持任何第三方的數(shù)據(jù)庫連接池 |
DBCP, C3P0, BoneCP, Druid, HikariCP等。 |
|
支持任意實現(xiàn)JDBC規(guī)范的數(shù)據(jù)庫 |
目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標(biāo)準(zhǔn)的數(shù)據(jù)庫。 |
2、pom 依賴:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
接下來我們就做一個小案例,首先我們要把我們MySQL主從復(fù)制配置,教程在開篇已經(jīng)提供給各位了。
3、入門案例
首先我們要在項目pom 文件中引入依賴。
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency>
然后在yml 文件中配置數(shù)據(jù)源。
# 配置服務(wù)器
server:
port: 8081 # 配置端口號
spring:
shardingsphere:
datasource:
names:
master,slave # 數(shù)據(jù)源的名稱master,slave是可以隨意定義的,不是固定的
# write主數(shù)據(jù)源: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從數(shù)據(jù)源: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 #輪詢 如果有多個從庫,從庫的負(fù)載均衡策略
# 最終的數(shù)據(jù)源名稱
name: dataSource
# 主庫數(shù)據(jù)源名稱
master-data-source-name: master #主庫數(shù)據(jù)庫名稱
# 從庫數(shù)據(jù)源名稱列表,多個逗號分隔
slave-data-source-names: slave #從庫數(shù)據(jù)庫名稱
props:
sql:
show: true #開啟SQL顯示,默認(rèn)false
main:
allow-bean-definition-overriding: true # 允許如果當(dāng)前項目中存在同名的bean,后定義的bean會覆蓋先定義的
mybatis-plus:
configuration:
#在映射實體或者屬性時,將數(shù)據(jù)庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射
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 #設(shè)置為列名允許映射駝峰命名法
4、測試
我們使用shardingjdbc來實現(xiàn)讀寫分離,直接通過上述簡單的配置就可以了。
配置完畢之后,我們就可以重啟服務(wù),通過postman來訪問controller的方法,來完成用戶信息的增刪改查,我們可以通過debug及日志的方式來查看每一次執(zhí)行增刪改查操作,使用的是哪個數(shù)據(jù)源,連接的是哪個數(shù)據(jù)庫。
4.1 增加

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

4.2 刪除

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

4.3 修改

控制臺輸出日志,可以看到操作master主庫:
4.4 查詢

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

ps:
Sharding-JDBC官方地址
轉(zhuǎn)載自:https://blog.csdn.net/weixin_53041251/article/details/126985331


浙公網(wǎng)安備 33010602011771號