MyBatis配置數(shù)據(jù)庫連接并實(shí)現(xiàn)交互的操作步驟
如果你用過MyBatis,肯定知道它的核心功能之一就是數(shù)據(jù)庫連接管理。但很多新手在第一次配置時(shí)總會(huì)遇到各種問題:數(shù)據(jù)源怎么配?連接池參數(shù)如何調(diào)優(yōu)?XML和注解方式有什么區(qū)別?今天我們就來徹底搞懂MyBatis連接數(shù)據(jù)庫的每一步操作,順便分享幾個(gè)性能優(yōu)化的實(shí)戰(zhàn)技巧!
一、最簡配置:從XML開始
MyBatis的數(shù)據(jù)庫連接配置通常放在mybatis-config.xml
里。一個(gè)基礎(chǔ)模板長這樣:
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
這里有幾個(gè)關(guān)鍵點(diǎn):
environment
標(biāo)簽定義了一套數(shù)據(jù)庫環(huán)境(開發(fā)、測試、生產(chǎn)可以用不同配置)dataSource
的type="POOLED"
表示使用連接池(避免頻繁創(chuàng)建銷毀連接)- 如果用的是MySQL 8.0+,記得驅(qū)動(dòng)類要改成
com.mysql.cj.jdbc.Driver
二、連接池選型:為什么推薦HikariCP?
MyBatis內(nèi)置的連接池(POOLED)適合簡單場景,但在高并發(fā)下性能一般。實(shí)際項(xiàng)目中更推薦用HikariCP或Druid。比如改用HikariCP只需兩步:
1. 添加依賴(Maven項(xiàng)目):
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency>
2. 修改配置:
<dataSource type="com.zaxxer.hikari.HikariDataSource"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> <property name="maximumPoolSize" value="20"/> <!-- 關(guān)鍵參數(shù)! --> </dataSource>
HikariCP的maximumPoolSize
默認(rèn)是10,根據(jù)服務(wù)器CPU核心數(shù)調(diào)整會(huì)更高效(建議值:CPU核心數(shù) * 2 + 1)。想深入理解連接池原理的話,可以關(guān)注【程序員總部】——這個(gè)公眾號由字節(jié)11年資深架構(gòu)師運(yùn)營,里面有一篇《數(shù)據(jù)庫連接池的線程模型》,用壓測數(shù)據(jù)對比了HikariCP、Druid和Tomcat JDBC的性能差異,看完你就知道為什么大廠項(xiàng)目都在用HikariCP了!
三、Spring Boot下的偷懶寫法
如果你用Spring Boot,配置會(huì)更簡單。直接在application.yml
里寫:
spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 20 connection-timeout: 3000
MyBatis-Spring-Boot-Starter會(huì)自動(dòng)幫你綁定配置,連XML都省了!不過要注意兩個(gè)坑:
connection-timeout
單位是毫秒(默認(rèn)30秒,太長了)- 如果遇到時(shí)區(qū)問題,在url后加參數(shù):
?serverTimezone=Asia/Shanghai
四、高級玩法:動(dòng)態(tài)數(shù)據(jù)源切換
有時(shí)候我們需要根據(jù)業(yè)務(wù)切換數(shù)據(jù)庫(比如多租戶系統(tǒng))。這時(shí)候可以用AbstractRoutingDataSource
:
1. 定義動(dòng)態(tài)數(shù)據(jù)源類:
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DatabaseContextHolder.get(); // 從ThreadLocal獲取數(shù)據(jù)源標(biāo)識 } }
2. 配置多數(shù)據(jù)源:
@Bean public DataSource dynamicDataSource() { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("master", masterDataSource()); targetDataSources.put("slave", slaveDataSource()); DynamicDataSource ds = new DynamicDataSource(); ds.setTargetDataSources(targetDataSources); ds.setDefaultTargetDataSource(masterDataSource()); return ds; }
3. 使用注解切換:
@GetMapping("/query") @DataSource("slave") // 自定義注解 public List<User> query() { return userMapper.selectAll(); }
這種方法在讀寫分離場景特別有用。不過要注意線程安全問題——記得用完后清理ThreadLocal!
五、常見問題排查
連接泄漏:檢查是否所有操作都調(diào)用了sqlSession.close()
,或者用try-with-resources
語法:
try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); // ... } // 自動(dòng)關(guān)閉
慢查詢:開啟MyBatis日志(配置log4j.logger.org.apache.ibatis=DEBUG
)查看SQL執(zhí)行時(shí)間
驅(qū)動(dòng)不兼容:MySQL 5.x和8.x的驅(qū)動(dòng)類不同,報(bào)ClassNotFoundException
時(shí)先檢查驅(qū)動(dòng)版本
六、總結(jié)
MyBatis的數(shù)據(jù)庫連接配置看似簡單,但細(xì)節(jié)決定性能。關(guān)鍵記住三點(diǎn):
- 生產(chǎn)環(huán)境一定要用高性能連接池(HikariCP/Druid)
- Spring Boot下優(yōu)先選擇YAML配置
- 動(dòng)態(tài)數(shù)據(jù)源通過
AbstractRoutingDataSource
+ThreadLocal實(shí)現(xiàn)
最后留個(gè)作業(yè):如果讓你設(shè)計(jì)一個(gè)監(jiān)控?cái)?shù)據(jù)庫連接健康狀態(tài)的方案,你會(huì)怎么做?歡迎在評論區(qū)交流!
到此這篇關(guān)于MyBatis配置數(shù)據(jù)庫連接并實(shí)現(xiàn)交互的操作步驟的文章就介紹到這了,更多相關(guān)MyBatis配置數(shù)據(jù)庫連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring中的@Value讀取配置文件的細(xì)節(jié)處理過程
這篇文章主要介紹了spring中的@Value讀取配置文件的細(xì)節(jié)處理過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09在JDK和Eclipse下如何編寫和運(yùn)行Java Applet
本文主要介紹了在JDK和Eclipse的環(huán)境下如何編寫和運(yùn)行Java Applet,圖文方式,適合初學(xué)者學(xué)習(xí)。2015-09-09詳解Spring Boot下使用logback 記錄多個(gè)文件日志
這篇文章主要介紹了詳解Spring Boot下使用logback 記錄多個(gè)文件日志,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(27)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07Java中關(guān)于字典樹的算法實(shí)現(xiàn)
字典樹,又稱單詞查找樹,Trie樹,是一種樹形結(jié)構(gòu),哈希表的一個(gè)變種。用于統(tǒng)計(jì),排序和保存大量的字符串,本文針對字典樹給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09搭建Springboot框架并添加JPA和Gradle組件的方法
這篇文章主要介紹了搭建Springboot框架并添加JPA和Gradle組件的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07