MyBatis 自帶連接池的具體實現(xiàn)
MyBatis 本身并不提供專門的連接池實現(xiàn),但它可以通過內(nèi)置的 PooledDataSource
類提供一個簡單的數(shù)據(jù)庫連接池。這個連接池實現(xiàn)非?;A(chǔ),適合一些簡單場景,但對于生產(chǎn)環(huán)境,通常建議使用第三方的成熟連接池,如 HikariCP、Apache DBCP 或 C3P0 等。
1. MyBatis 自帶的連接池 PooledDataSource
PooledDataSource
是 MyBatis 提供的一個簡單的數(shù)據(jù)庫連接池實現(xiàn)。它將數(shù)據(jù)庫連接保存在池中,避免頻繁創(chuàng)建和銷毀連接,從而提高性能。PooledDataSource
基于傳統(tǒng)的對象池思想設(shè)計,包含了最基本的連接池功能。
1.1 PooledDataSource 的基本工作原理
連接創(chuàng)建和回收:當應(yīng)用程序請求數(shù)據(jù)庫連接時,
PooledDataSource
會從池中取出一個可用的連接。如果池中沒有可用的連接且未達到最大連接數(shù),則創(chuàng)建一個新連接;否則,應(yīng)用程序需要等待,直到有連接被歸還到池中。連接復(fù)用:當應(yīng)用程序使用完連接后,連接并不會關(guān)閉,而是被歸還到池中,供后續(xù)請求復(fù)用。
連接有效性檢測:
PooledDataSource
會檢測連接是否有效,如果發(fā)現(xiàn)連接失效(如網(wǎng)絡(luò)異常、數(shù)據(jù)庫重啟等導(dǎo)致的連接中斷),會銷毀該連接,并在下次請求時創(chuàng)建一個新連接。
1.2 PooledDataSource 的配置參數(shù)
你可以在 MyBatis 的配置文件中配置 PooledDataSource
。以下是常用的配置參數(shù):
driver
:JDBC 驅(qū)動類名稱。url
:數(shù)據(jù)庫連接 URL。username
:數(shù)據(jù)庫用戶名。password
:數(shù)據(jù)庫密碼。poolMaximumActiveConnections
:池中可同時使用的最大連接數(shù),默認值是 10。poolMaximumIdleConnections
:池中最大空閑連接數(shù),默認值是 5。poolMaximumCheckoutTime
:連接被取出后最長可以使用的時間,超時后連接會被強制回收,默認值是 20000 毫秒(20 秒)。poolTimeToWait
:沒有可用連接時,線程最多等待的時間,超時則拋出異常,默認值是 20000 毫秒(20 秒)。poolPingQuery
:用于測試連接是否有效的 SQL 語句,默認是 "NO PING QUERY SET"。poolPingEnabled
:是否啟用偵測連接有效性的ping
操作,默認值是false
。poolPingConnectionsNotUsedFor
:配置多少時間未使用的連接需要進行一次ping
操作,默認值是 0 毫秒(即每次都進行ping
檢測)。
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>
在這個配置中,PooledDataSource
配置了 MySQL 數(shù)據(jù)庫連接池,最多允許 20 個連接同時活躍,10 個空閑連接,并且配置了連接有效性檢測。
1.4 使用 PooledDataSource 的局限性
雖然 PooledDataSource
可以滿足一些基本的連接池需求,但它的功能和性能相對較為簡單,可能不適合復(fù)雜的生產(chǎn)環(huán)境。以下是一些局限性:
缺乏高級功能:
PooledDataSource
缺少許多現(xiàn)代連接池所提供的高級特性,如連接泄漏檢測、連接池監(jiān)控、異步連接回收等。性能有限:
PooledDataSource
在高并發(fā)環(huán)境下的性能和穩(wěn)定性可能不如專業(yè)的連接池實現(xiàn)。可擴展性差:
PooledDataSource
的可擴展性較差,不易定制和擴展。
2. 生產(chǎn)環(huán)境推薦使用的連接池
在生產(chǎn)環(huán)境中,建議使用性能更好、功能更強大的連接池實現(xiàn),如:
HikariCP:HikariCP 是目前性能最好的 JDBC 連接池之一,具有非常低的連接延遲和很高的吞吐量,并且配置簡單、功能強大。
Apache DBCP:DBCP 是 Apache Commons 提供的連接池實現(xiàn),功能豐富,廣泛使用于各種 Java 應(yīng)用中。
C3P0:C3P0 是一個成熟的連接池實現(xiàn),提供了豐富的配置選項和較好的性能表現(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 自帶的簡單連接池實現(xiàn),適合簡單場景,提供了基本的連接池管理功能。局限性:
PooledDataSource
在性能、功能、穩(wěn)定性方面存在一些局限性,不適合生產(chǎn)環(huán)境。推薦使用第三方連接池:在生產(chǎn)環(huán)境中,建議使用功能更強大、性能更好的連接池實現(xiàn),如 HikariCP、Apache DBCP 或 C3P0。
切換連接池:MyBatis 支持通過簡單的配置切換到其他連接池,靈活性高。
到此這篇關(guān)于MyBatis 自帶連接池的具體實現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis 自帶連接池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis-Plus根據(jù)自定義注解實現(xiàn)自動加解密的示例代碼
我們把數(shù)據(jù)存到數(shù)據(jù)庫的時候,有些敏感字段是需要加密的,從數(shù)據(jù)庫查出來再進行解密,如果我們使用的是Mybatis框架,那就跟著一起探索下如何使用框架的攔截器功能實現(xiàn)自動加解密吧,需要的朋友可以參考下2024-06-06SpringBoot環(huán)境搭建及第一個程序運行(小白教程)
這篇文章主要介紹了SpringBoot環(huán)境搭建及第一個程序運行,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06Java利用TCP實現(xiàn)服務(wù)端向客戶端消息群發(fā)的示例代碼
這篇文章主要為大家詳細介紹了Java如何利用TCP協(xié)議實現(xiàn)服務(wù)端向客戶端消息群發(fā)功能,文中的示例代碼講解詳細,需要的可以參考下,希望對你有所幫助2022-08-08