MyBatis 自带连接池的具体实现

 更新时间:2024年12月04日 10:20:39   作者:这孩子叫逆  
MyBatis自带的PooledDataSource实现了一个简单的数据库连接池,适合简单场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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 自带连接池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • java easyPOI实现导出一对多数据

    java easyPOI实现导出一对多数据

    这篇文章主要为大家详细介绍了java如何利用easyPOI实现导出一对多数据,并且可以设置边框、字体和字体大小,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 解读Maven安装全过程

    解读Maven安装全过程

    下载并安装Maven时,需注意IDE的兼容版本,例如,IDEA2022及之前兼容至Maven3.8.1,而IDEA2020则至3.6.3,安装后,配置MAVEN_HOME环境变量并调整settings.xml以使用本地仓库和阿里云镜像,以优化构建和下载速度,最后,确保IDEA项目默认使用正确的Maven配置
    2024-11-11
  • SpringMVC4 + MyBatis3 + SQL Server 2014整合教程(含增删改查分页)

    SpringMVC4 + MyBatis3 + SQL Server 2014整合教程(含增删改查分页)

    这篇文章主要给大家介绍了关于SpringMVC4 + MyBatis3 + SQL Server 2014整合的相关资料,文中包括介绍了增删改查分页等相关内容,通过示例代码介绍的非常详细,分享出来供大家参考学习,下面来一起看看吧。
    2017-06-06
  • 创建一个Java的不可变对象

    创建一个Java的不可变对象

    这篇文章主要介绍了创建一个Java的不可变对象,一个类的对象在通过构造方法创建后如果状态不会再被改变,那么它就是一个不可变(immutable)类。它的所有成员变量的赋值仅在构造方法中完成,不会提供任何 setter 方法供外部类去修改,需要的朋友可以参考下
    2021-11-11
  • 详解如何在spring中创建全局异常处理器

    详解如何在spring中创建全局异常处理器

    全局异常处理器在实际项目开发中是一个很重要的工具,对保证代码的正常运行有很重要的作用,所以下面来讲一下如何在spring中创建一个全局异常处理器,感兴趣的的朋友可以参考下
    2023-12-12
  • 透明化Sharding-JDBC数据库字段加解密方案

    透明化Sharding-JDBC数据库字段加解密方案

    这篇文章主要为大家介绍了透明化Sharding-JDBC数据库字段加解密方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • java property配置文件管理工具框架过程详解

    java property配置文件管理工具框架过程详解

    这篇文章主要介绍了java property配置文件管理工具框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java 数据库连接池Druid 的介绍

    Java 数据库连接池Druid 的介绍

    这篇文章主要给大家分享的是 Java 数据库连接池Druid 的介绍,Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池,下面来看看文中的详细内容,需要的朋友也可以参考一下
    2021-11-11
  • 详解Spring中bean实例化的三种方式

    详解Spring中bean实例化的三种方式

    本篇文章主要介绍了详解Spring中bean实例化的三种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java 在PDF中添加条形码的两种方法

    Java 在PDF中添加条形码的两种方法

    本文就将通过使用Java程序来演示如何在PDF文档中添加Codebar、Code128A和Code39条形码。通过实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-03-03

最新评论