返回顶部
首页 > 资讯 > 后端开发 > Python >详解Mybatis中的PooledDataSource
  • 207
分享到

详解Mybatis中的PooledDataSource

2024-04-02 19:04:59 207人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言PooledConnectionPooledDataSource的pushConnection()方法总结前言 上篇Java mybatis数据源之工厂模式文章中我

前言

上篇Java mybatis数据源之工厂模式文章中我们介绍了Mybatis的数据源模块的DataSource接口和它对应的实现类UnpooledDataSource、PooledDataSource,这篇文章详细介绍一下PooledDataSource
PooledDataSource使用了数据库连接池可以实现数据库连接池的重复利用,还能控制连接数据库的连接上限,实现数据库连接的统一管理,缓存数据连接信息还能防止流量突发连接数据库不及时

PooledDataSource有个PoolState状态,PoolState里保存着数据库连接信息PooledConnection,PooledConnection实现InvocationHandler接口,重写invoke方法,显然这是一个代理类,使用了jdk的动态代理

PooledConnection

   class PooledConnection implements InvocationHandler {
    private static final Class<?>[] IFACES = new Class<?>[] { Connection.class };
    public PooledConnection(Connection connection, PooledDataSource dataSource) {
        this.hashCode = connection.hashCode();
        this.realConnection = connection;
        this.dataSource = dataSource;
        this.createdTimestamp = System.currentTimeMillis();
        this.lastUsedTimestamp = System.currentTimeMillis();
        this.valid = true;
        this.proxyConnection = (Connection) Proxy.newProxyInstance(Connection.class.getClassLoader(), IFACES, this);
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String methodName = method.getName();
        if (CLOSE.equals(methodName)) {
            dataSource.pushConnection(this);
            return null;
        }
        try {
            if (!Object.class.equals(method.getDeclarinGClass())) {
                checkConnection();
            }
            return method.invoke(realConnection, args);
        } catch (Throwable t) {
            throw ExceptionUtil.unwrapThrowable(t);
        }
    }
}

我们看一看到构造方法中调用了Proxy.newProxyInstance()方法来生成代理类,而重写invoke方法中如果是close()就调用pushConnection()方法直接把它放入连接池而不是关闭连接,其他情况调用checkConnection()检查连接信息,代理类调用realConnection()方法,下面就看一下pushConnection()方法

PooledDataSource的pushConnection()方法

方法的功能就是把数据库连接放入连接池中:

protected void pushConnection(PooledConnection conn) throws sqlException {
        synchronized (state) {
            state.activeConnections.remove(conn);
            if (conn.isValid()) {
                if (state.idleConnections.size() < poolMaximumIdleConnections && conn.getConnectionTypeCode() == expectedConnectionTypeCode) {
                    state.accumulatedCheckoutTime += conn.getCheckoutTime();
                    if (!conn.getRealConnection().getAutoCommit()) {
                        conn.getRealConnection().rollback();
                    }
                    PooledConnection newConn = new PooledConnection(conn.getRealConnection(), this);
                    state.idleConnections.add(newConn);
                    newConn.setCreatedTimestamp(conn.getCreatedTimestamp());
                    newConn.setLastUsedTimestamp(conn.getLastUsedTimestamp());
                    conn.invalidate(); 
                    if (log.isDebugEnabled()) {
                        log.debug("Returned connection " + newConn.getRealHashCode() + " to pool.");
                    }
                    state.notifyAll();
                } else {

                    state.accumulatedCheckoutTime += conn.getCheckoutTime();
                    if (!conn.getRealConnection().getAutoCommit()) {
                        conn.getRealConnection().rollback();
                    }
                    conn.getRealConnection().close();
                    if (log.isDebugEnabled()) {
                        log.debug("Closed connection " + conn.getRealHashCode() + ".");
                    }
                    conn.invalidate();
                }
            } else {
                if (log.isDebugEnabled()) {
                    log.debug("A bad connection (" + conn.getRealHashCode() + ") attempted to return to the pool, discarding connection.");
                }
                state.badConnectionCount++;
            }
        }
    }
  • 从活跃连接集合中删除该连接
  • 如果PooledConnection有效,并且空闲连接数小于最大空闲连接数,就利用当前PooledConnection创建PooledConnection,放入空闲连接数集合中,方便下次使用,关闭当前PooledConnection对象的数据库连接,并对当前PooledConnection对象设置无效,最后唤醒其他等待的线程。如果空闲连接数大于最大空闲连接数了就关闭连接,设置当前连接无效
  • 如果PooledConnection无效,badConnectionCount加一,这个badConnectionCount是记录无效的数据库连接信息的

总结

本篇文章主要介绍了PooledConnection和PooledDataSource的pushConnection()方法,PooledConnection用到了jdk的动态代理,生成Connection的实现类的代理类,拦截的逻辑中对于close()方法没有真正关闭,而是把数据库连接信息放入连接池中供下次再使用,数据库连接信息放入连接池的过程是通过调用PooledDataSource的pushConnection()来完成的,具体就是从活跃连接集合中删除这个连接,然后放入空闲连接数集合中并把当前连接设置为无效。

到此这篇关于详解Mybatis中的PooledDataSource的文章就介绍到这了,更多相关Mybatis PooledDataSource内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Mybatis中的PooledDataSource

本文链接: https://lsjlt.com/news/151275.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Mybatis中的PooledDataSource
    目录前言PooledConnectionPooledDataSource的pushConnection()方法总结前言 上篇Java Mybatis数据源之工厂模式文章中我...
    99+
    2024-04-02
  • mybatis中#{}和${}的区别详解
    目录一、MyBatis中${}和#{}的区别1.1 ${}和#{}演示1.2 SQL注入问题1.3 ${}和#{}的区别1.4 #{}底层是如何防止SQL注入的?1.4.1 网上的答...
    99+
    2024-04-02
  • Mybatis中@Param注解的用法详解
    目录1、概述2、实例:实例一:@Param注解基本类型的参数实例二:@Param注解JavaBean对象3、注意点附:为什么要用@param总结1、概述 首先明确这个注解是为SQL语...
    99+
    2024-04-02
  • Mybatis Plus 中的LambdaQueryWrapper示例详解
    目录前言QueryWrapperLambdaQueryWrapper总结前言 之前写过 Mybatis Plus 的基本配置和使用。 Mybatis-Plus 看这一篇就够了 当初在...
    99+
    2024-04-02
  • MyBatis中Mapper的注入问题详解
    在 SpringBoot 体系中,MyBatis 对 Mapper 的注入常见的方式我知道的有 2 种: 1、@MapperScan MapperScan 类是 mybatis-sp...
    99+
    2024-04-02
  • 详解Mybatis中javaType和ofType的区别
    目录一. 背景描述二. 情景再现1. 实体类2.BookMapper.xml映射文件3. 核心配置4. 测试代码5. 修改实体类6. 添加映射文件BookTypeMapper.xml...
    99+
    2023-05-20
    Mybatis javaType和ofType
  • 详解MyBatis中column属性的总结
    在MyBatis的映射中有column这么一个属性,我一直以为它映射的是数据库表中的列名,但经过学习发现他似乎映射的是SQL语句中的列名,或者说是查询结果所得到的表的列名。 下面我们...
    99+
    2024-04-02
  • MyBatis中OGNL的使用教程详解
    前言本文主要给大家讲如何在MyBatis中使用OGNL的相关内容,分享出来供大家参考学习,感兴趣的朋友们下面来一起看看详细的介绍:如果我们搜索OGNL相关的内容,通常的结果都是和Struts有关的,你肯定搜不到和MyBatis有关的,虽然和...
    99+
    2023-05-31
    mybatis 使用 ognl
  • MyBatis——MappedStatement详解
    MyBatis通过MappedStatement描述或者@Select、@Update等注解配置的SQL信息。在介绍MappedStatement组件之前,我们先来了解一下MyBatis中SQL Mapper的配置。不同类型的SQL语句需要...
    99+
    2022-03-20
    MyBatis——MappedStatement详解
  • Mybatis-Plus详解
    目录 1. Mybatis-Plus概念 1.1 Mybatis-Plus介绍 1.2 特性 1.3 架构 2. Mybatis-Plus快速⼊⻔ 2.1 安装 2.2 创建数据库以及表 2.3 创建⼯程 2.4 Mybatis + MP ...
    99+
    2023-09-01
    mybatis java mysql
  • mybatis-plus中wrapper的用法实例详解
    目录一、条件构造器关系介绍条件构造器关系介绍 :wapper介绍 :二、项目实例1、根据主键或者简单的查询条件进行查询2、MyBatis-Plus还提供了Wrapper条件构造器,具...
    99+
    2024-04-02
  • Mybatis中@Param的用法和作用详解
    用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中我们先来看Mapper接口中的@Select方法package Mapper; public inte...
    99+
    2023-05-31
    mybatis param
  • Mybatis中like搭配concat的写法详解
    目录Mybatis like搭配concat写法在Mybatis中的写法Mybatis concat()函数模糊查询Mybatis like搭配concat写法 在Myba...
    99+
    2024-04-02
  • Mybatis中resultMap的Colum和property属性详解
    目录resultMap的Colum和property属性1: resultMap标签2:使用情况2.1 简单查询2.2 一对一2.3 一对多resultMap对column和prop...
    99+
    2024-04-02
  • mybatis的selectKey作用详解
    目录mybatis的selectKey作用mybatis selectKey 失效问题踩坑mybatis的selectKey作用 当我们使用id自增操作Mybatis时,需要返回最新...
    99+
    2024-04-02
  • MyBatis中的ResultMap的association和collection标签详解
    目录一、前言二、ResultMap 的属性列表三、resultMap标签介绍四、id & result标签参数详解五、association标签常用参数详解六、collect...
    99+
    2022-11-13
    MyBatis association和collection标签 MyBatis  ResultMap
  • 详解mybatis中的if-else的嵌套使用
    目录案例一:if-else案例二:if嵌套MyBatis中if和choose的嵌套案例一:if-else 在mybatis的使用过程中,难免会存在使用if-else的逻辑,但是实际是...
    99+
    2024-04-02
  • mybatis-plus在yml中配置详解
    目录pom配置正常使用基础配置扩展配置pom配置 <dependency> <groupId>com.baomidou</groupId>...
    99+
    2023-02-24
    mybatis-plus yml配置 mybatis-plus yml
  • Mybatis缓存详解
     什么是Mybatis缓存  使用缓存可以减少Java Application与数据库的交互次数,从而提升程序的运行效率。比如,查询id=1的user对象,第一次查询出来之后,会自动将该对象保存到缓存中。下...
    99+
    2024-04-02
  • Java mybatis-plus详解
    目录1、简介2、适用情况3、mybatis-plus前期准备(工程将以 H2 作为默认数据库进行演示)1、使用 Spring Initializer快速初始化一个 Spring Bo...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作