MyBatis 自帶連接池的具體實(shí)現(xiàn)
MyBatis 本身并不提供專(zhuān)門(mén)的連接池實(shí)現(xiàn),但它可以通過(guò)內(nèi)置的 PooledDataSource
類(lèi)提供一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)連接池。這個(gè)連接池實(shí)現(xiàn)非?;A(chǔ),適合一些簡(jiǎn)單場(chǎng)景,但對(duì)于生產(chǎn)環(huán)境,通常建議使用第三方的成熟連接池,如 HikariCP、Apache DBCP 或 C3P0 等。
1. MyBatis 自帶的連接池 PooledDataSource
PooledDataSource
是 MyBatis 提供的一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)。它將數(shù)據(jù)庫(kù)連接保存在池中,避免頻繁創(chuàng)建和銷(xiāo)毀連接,從而提高性能。PooledDataSource
基于傳統(tǒng)的對(duì)象池思想設(shè)計(jì),包含了最基本的連接池功能。
1.1 PooledDataSource 的基本工作原理
連接創(chuàng)建和回收:當(dāng)應(yīng)用程序請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),
PooledDataSource
會(huì)從池中取出一個(gè)可用的連接。如果池中沒(méi)有可用的連接且未達(dá)到最大連接數(shù),則創(chuàng)建一個(gè)新連接;否則,應(yīng)用程序需要等待,直到有連接被歸還到池中。連接復(fù)用:當(dāng)應(yīng)用程序使用完連接后,連接并不會(huì)關(guān)閉,而是被歸還到池中,供后續(xù)請(qǐng)求復(fù)用。
連接有效性檢測(cè):
PooledDataSource
會(huì)檢測(cè)連接是否有效,如果發(fā)現(xiàn)連接失效(如網(wǎng)絡(luò)異常、數(shù)據(jù)庫(kù)重啟等導(dǎo)致的連接中斷),會(huì)銷(xiāo)毀該連接,并在下次請(qǐng)求時(shí)創(chuàng)建一個(gè)新連接。
1.2 PooledDataSource 的配置參數(shù)
你可以在 MyBatis 的配置文件中配置 PooledDataSource
。以下是常用的配置參數(shù):
driver
:JDBC 驅(qū)動(dòng)類(lèi)名稱(chēng)。url
:數(shù)據(jù)庫(kù)連接 URL。username
:數(shù)據(jù)庫(kù)用戶名。password
:數(shù)據(jù)庫(kù)密碼。poolMaximumActiveConnections
:池中可同時(shí)使用的最大連接數(shù),默認(rèn)值是 10。poolMaximumIdleConnections
:池中最大空閑連接數(shù),默認(rèn)值是 5。poolMaximumCheckoutTime
:連接被取出后最長(zhǎng)可以使用的時(shí)間,超時(shí)后連接會(huì)被強(qiáng)制回收,默認(rèn)值是 20000 毫秒(20 秒)。poolTimeToWait
:沒(méi)有可用連接時(shí),線程最多等待的時(shí)間,超時(shí)則拋出異常,默認(rèn)值是 20000 毫秒(20 秒)。poolPingQuery
:用于測(cè)試連接是否有效的 SQL 語(yǔ)句,默認(rèn)是 "NO PING QUERY SET"。poolPingEnabled
:是否啟用偵測(cè)連接有效性的ping
操作,默認(rèn)值是false
。poolPingConnectionsNotUsedFor
:配置多少時(shí)間未使用的連接需要進(jìn)行一次ping
操作,默認(rèn)值是 0 毫秒(即每次都進(jìn)行ping
檢測(cè))。
1.3 示例配置
以下是使用 PooledDataSource
的 MyBatis 配置文件示例:
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydb"/> <property name="username" value="root"/> <property name="password" value="password"/> <property name="poolMaximumActiveConnections" value="20"/> <property name="poolMaximumIdleConnections" value="10"/> <property name="poolMaximumCheckoutTime" value="30000"/> <property name="poolTimeToWait" value="30000"/> <property name="poolPingQuery" value="SELECT 1"/> <property name="poolPingEnabled" value="true"/> <property name="poolPingConnectionsNotUsedFor" value="60000"/> </dataSource> </environment> </environments> </configuration>
在這個(gè)配置中,PooledDataSource
配置了 MySQL 數(shù)據(jù)庫(kù)連接池,最多允許 20 個(gè)連接同時(shí)活躍,10 個(gè)空閑連接,并且配置了連接有效性檢測(cè)。
1.4 使用 PooledDataSource 的局限性
雖然 PooledDataSource
可以滿足一些基本的連接池需求,但它的功能和性能相對(duì)較為簡(jiǎn)單,可能不適合復(fù)雜的生產(chǎn)環(huán)境。以下是一些局限性:
缺乏高級(jí)功能:
PooledDataSource
缺少許多現(xiàn)代連接池所提供的高級(jí)特性,如連接泄漏檢測(cè)、連接池監(jiān)控、異步連接回收等。性能有限:
PooledDataSource
在高并發(fā)環(huán)境下的性能和穩(wěn)定性可能不如專(zhuān)業(yè)的連接池實(shí)現(xiàn)。可擴(kuò)展性差:
PooledDataSource
的可擴(kuò)展性較差,不易定制和擴(kuò)展。
2. 生產(chǎn)環(huán)境推薦使用的連接池
在生產(chǎn)環(huán)境中,建議使用性能更好、功能更強(qiáng)大的連接池實(shí)現(xiàn),如:
HikariCP:HikariCP 是目前性能最好的 JDBC 連接池之一,具有非常低的連接延遲和很高的吞吐量,并且配置簡(jiǎn)單、功能強(qiáng)大。
Apache DBCP:DBCP 是 Apache Commons 提供的連接池實(shí)現(xiàn),功能豐富,廣泛使用于各種 Java 應(yīng)用中。
C3P0:C3P0 是一個(gè)成熟的連接池實(shí)現(xiàn),提供了豐富的配置選項(xiàng)和較好的性能表現(xiàn)。
3. 切換到第三方連接池
如果要切換到第三方連接池,MyBatis 只需要更改配置即可。以 HikariCP 為例:
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="com.zaxxer.hikari.HikariDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb"/> <property name="username" value="root"/> <property name="password" value="password"/> <property name="maximumPoolSize" value="20"/> <property name="minimumIdle" value="10"/> <property name="idleTimeout" value="600000"/> <property name="connectionTimeout" value="30000"/> </dataSource> </environment> </environments> </configuration>
總結(jié)
PooledDataSource
:MyBatis 自帶的簡(jiǎn)單連接池實(shí)現(xiàn),適合簡(jiǎn)單場(chǎng)景,提供了基本的連接池管理功能。局限性:
PooledDataSource
在性能、功能、穩(wěn)定性方面存在一些局限性,不適合生產(chǎn)環(huán)境。推薦使用第三方連接池:在生產(chǎn)環(huán)境中,建議使用功能更強(qiáng)大、性能更好的連接池實(shí)現(xiàn),如 HikariCP、Apache DBCP 或 C3P0。
切換連接池:MyBatis 支持通過(guò)簡(jiǎn)單的配置切換到其他連接池,靈活性高。
到此這篇關(guān)于MyBatis 自帶連接池的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis 自帶連接池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis-Plus根據(jù)自定義注解實(shí)現(xiàn)自動(dòng)加解密的示例代碼
我們把數(shù)據(jù)存到數(shù)據(jù)庫(kù)的時(shí)候,有些敏感字段是需要加密的,從數(shù)據(jù)庫(kù)查出來(lái)再進(jìn)行解密,如果我們使用的是Mybatis框架,那就跟著一起探索下如何使用框架的攔截器功能實(shí)現(xiàn)自動(dòng)加解密吧,需要的朋友可以參考下2024-06-06創(chuàng)建并運(yùn)行一個(gè)java線程方法介紹
這篇文章主要介紹了創(chuàng)建并運(yùn)行一個(gè)java線程,涉及線程代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11踩坑Debug啟動(dòng)失敗,無(wú)報(bào)錯(cuò)信息問(wèn)題
在進(jìn)行項(xiàng)目debug時(shí)遇到了無(wú)法啟動(dòng)的問(wèn)題,項(xiàng)目一直處于正在啟動(dòng)狀態(tài),但未出現(xiàn)任何報(bào)錯(cuò)信息,分析原因可能是存在不合法的斷點(diǎn)位置,即斷點(diǎn)未打在方法內(nèi)部,解決方法是檢查所有斷點(diǎn)信息,并移除非法斷點(diǎn),之后項(xiàng)目能夠正常啟動(dòng)2023-02-02SpringBoot環(huán)境搭建及第一個(gè)程序運(yùn)行(小白教程)
這篇文章主要介紹了SpringBoot環(huán)境搭建及第一個(gè)程序運(yùn)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java中Properties類(lèi)的操作實(shí)例詳解
這篇文章主要介紹了Java中Properties類(lèi)的操作實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Java利用TCP實(shí)現(xiàn)服務(wù)端向客戶端消息群發(fā)的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java如何利用TCP協(xié)議實(shí)現(xiàn)服務(wù)端向客戶端消息群發(fā)功能,文中的示例代碼講解詳細(xì),需要的可以參考下,希望對(duì)你有所幫助2022-08-08