15. MyBatis 自带的连接池有了解过吗?

embedded/2024/12/22 22:06:53/

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 支持通过简单的配置切换到其他连接池,灵活性高。


http://www.ppmy.cn/embedded/109685.html

相关文章

在centos上搭建syslog服务端

在CentOS上搭建一个syslog服务器&#xff0c;可以使用rsyslog服务 安装rsyslog&#xff1a; sudo yum install rsyslog编辑配置文件 /etc/rsyslog.conf&#xff0c;确保以下设置&#xff1a; 确保服务器监听在UDP 514端口上&#xff1a; $ModLoad imudp $UDPServerRun 514禁…

电容器件选型

电容选型 电容分类 钽电容 陶瓷电容 铝电解电容 电容封装尺寸 由下图知&#xff0c;温度在0℃-40℃容值是接近标称值的 滤波效果最好的点&#xff0c;即为电容谐振点&#xff0c;可根据公式算出&#xff0c;如果想滤波频段大&#xff0c;可以并联多个谐振频段的电容。 电容的…

Flask如何处理POST请求

Flask处理POST请求的过程是一个相对直接且灵活的过程&#xff0c;它允许开发者根据需求接收、处理并响应客户端发送的数据。以下是对Flask如何处理POST请求的详细简述&#xff1a; 1. 初始化Flask应用 首先&#xff0c;需要导入Flask模块并创建一个Flask应用实例。这是处理任…

DIAS:用于DSA序列中颅内动脉分割的数据集和基准|文献速递--基于深度学习的医学影像病灶分割

Title 题目 DIAS: A dataset and benchmark for intracranial artery segmentation in DSA sequences DIAS&#xff1a;用于DSA序列中颅内动脉分割的数据集和基准 01 文献速递介绍 脑血管疾病对全球死亡率和长期残疾的贡献巨大&#xff08;Vaduganathan等&#xff0c;2022…

React Native 0.76版本发布

关于 React Native 的 New Architecture 概念&#xff0c;最早应该是从 2018 年 RN 团队决定重写大量底层实现开始&#xff0c;因为那时候 React Native 面临各种结构问题和性能瓶颈&#xff0c;最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始&#xff0c;New A…

pyspark.sql.types

示例&#xff1a; from datetime import datetime, date from decimal import Decimal from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType, FloatType, ArrayType, BooleanType, \DateType, TimestampTy…

ffmpeg(各个系统版本安装- Windows11-Mac-Linux)

各个系统上的安装不建议使用编译安装&#xff0c;大佬的话可以 编译安装会各种环境问题&#xff0c;直接使用别人安装好的就行 1.Windows11上安装ffmpeg 1.官网下载ffmpeg 进入Download FFmpeg网址&#xff0c;点击下载windows版ffmpeg&#xff0c;使用别人编译好的版本即可 …

项目实战 ---- 商用落地视频搜索系统(7)---预处理二次优化

目录 背景 要解决的问题 技术理念与落地思路 完整代码 另外的问题与解决 优化运行效果 log 效果图 背景 作为商用落地系统,我们当然希望搜索视频的关联度或者说准确性与我们希望查询的视频相关度越高越好。为此,除了在query 层面上优化,我们还需要注重我们的录入数…