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

