MyBatis 自带连接池的具体实现
作者:这孩子叫逆
MyBatis 本身并不提供专门的连接池实现,但它可以通过内置的 PooledDataSource
类提供一个简单的数据库连接池。这个连接池实现非常基础,适合一些简单场景,但对于生产环境,通常建议使用第三方的成熟连接池,如 HikariCP、Apache DBCP 或 C3P0 等。
1. MyBatis 自带的连接池 PooledDataSource
PooledDataSource
是 MyBatis 提供的一个简单的数据库连接池实现。它将数据库连接保存在池中,避免频繁创建和销毁连接,从而提高性能。PooledDataSource
基于传统的对象池思想设计,包含了最基本的连接池功能。
1.1 PooledDataSource 的基本工作原理
连接创建和回收:当应用程序请求数据库连接时,
PooledDataSource
会从池中取出一个可用的连接。如果池中没有可用的连接且未达到最大连接数,则创建一个新连接;否则,应用程序需要等待,直到有连接被归还到池中。连接复用:当应用程序使用完连接后,连接并不会关闭,而是被归还到池中,供后续请求复用。
连接有效性检测:
PooledDataSource
会检测连接是否有效,如果发现连接失效(如网络异常、数据库重启等导致的连接中断),会销毁该连接,并在下次请求时创建一个新连接。
1.2 PooledDataSource 的配置参数
你可以在 MyBatis 的配置文件中配置 PooledDataSource
。以下是常用的配置参数:
driver
:JDBC 驱动类名称。url
:数据库连接 URL。username
:数据库用户名。password
:数据库密码。poolMaximumActiveConnections
:池中可同时使用的最大连接数,默认值是 10。poolMaximumIdleConnections
:池中最大空闲连接数,默认值是 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 数据库连接池,最多允许 20 个连接同时活跃,10 个空闲连接,并且配置了连接有效性检测。
1.4 使用 PooledDataSource 的局限性
虽然 PooledDataSource
可以满足一些基本的连接池需求,但它的功能和性能相对较为简单,可能不适合复杂的生产环境。以下是一些局限性:
缺乏高级功能:
PooledDataSource
缺少许多现代连接池所提供的高级特性,如连接泄漏检测、连接池监控、异步连接回收等。性能有限:
PooledDataSource
在高并发环境下的性能和稳定性可能不如专业的连接池实现。可扩展性差:
PooledDataSource
的可扩展性较差,不易定制和扩展。
2. 生产环境推荐使用的连接池
在生产环境中,建议使用性能更好、功能更强大的连接池实现,如:
HikariCP:HikariCP 是目前性能最好的 JDBC 连接池之一,具有非常低的连接延迟和很高的吞吐量,并且配置简单、功能强大。
Apache DBCP:DBCP 是 Apache Commons 提供的连接池实现,功能丰富,广泛使用于各种 Java 应用中。
C3P0:C3P0 是一个成熟的连接池实现,提供了丰富的配置选项和较好的性能表现。
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 自带的简单连接池实现,适合简单场景,提供了基本的连接池管理功能。局限性:
PooledDataSource
在性能、功能、稳定性方面存在一些局限性,不适合生产环境。推荐使用第三方连接池:在生产环境中,建议使用功能更强大、性能更好的连接池实现,如 HikariCP、Apache DBCP 或 C3P0。
切换连接池:MyBatis 支持通过简单的配置切换到其他连接池,灵活性高。
到此这篇关于MyBatis 自带连接池的具体实现的文章就介绍到这了,更多相关MyBatis 自带连接池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!