最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Mybatis中的PooledDataSource

 更新時(shí)間:2022年06月13日 14:16:01   作者:周杰倫本人  
這篇文章主要介紹了詳解Mybatis中的PooledDataSource,PooledDataSource使用了數(shù)據(jù)庫連接池可以實(shí)現(xiàn)數(shù)據(jù)庫連接池的重復(fù)利用,還能控制連接數(shù)據(jù)庫的連接上限

前言

上篇Java Mybatis數(shù)據(jù)源之工廠模式文章中我們介紹了Mybatis的數(shù)據(jù)源模塊的DataSource接口和它對(duì)應(yīng)的實(shí)現(xiàn)類UnpooledDataSource、PooledDataSource,這篇文章詳細(xì)介紹一下PooledDataSource
PooledDataSource使用了數(shù)據(jù)庫連接池可以實(shí)現(xiàn)數(shù)據(jù)庫連接池的重復(fù)利用,還能控制連接數(shù)據(jù)庫的連接上限,實(shí)現(xiàn)數(shù)據(jù)庫連接的統(tǒng)一管理,緩存數(shù)據(jù)連接信息還能防止流量突發(fā)連接數(shù)據(jù)庫不及時(shí)

PooledDataSource有個(gè)PoolState狀態(tài),PoolState里保存著數(shù)據(jù)庫連接信息PooledConnection,PooledConnection實(shí)現(xiàn)InvocationHandler接口,重寫invoke方法,顯然這是一個(gè)代理類,使用了JDK的動(dòng)態(tài)代理

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);
        }
    }
}

我們看一看到構(gòu)造方法中調(diào)用了Proxy.newProxyInstance()方法來生成代理類,而重寫invoke方法中如果是close()就調(diào)用pushConnection()方法直接把它放入連接池而不是關(guān)閉連接,其他情況調(diào)用checkConnection()檢查連接信息,代理類調(diào)用realConnection()方法,下面就看一下pushConnection()方法

PooledDataSource的pushConnection()方法

方法的功能就是把數(shù)據(jù)庫連接放入連接池中:

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有效,并且空閑連接數(shù)小于最大空閑連接數(shù),就利用當(dāng)前PooledConnection創(chuàng)建PooledConnection,放入空閑連接數(shù)集合中,方便下次使用,關(guān)閉當(dāng)前PooledConnection對(duì)象的數(shù)據(jù)庫連接,并對(duì)當(dāng)前PooledConnection對(duì)象設(shè)置無效,最后喚醒其他等待的線程。如果空閑連接數(shù)大于最大空閑連接數(shù)了就關(guān)閉連接,設(shè)置當(dāng)前連接無效
  • 如果PooledConnection無效,badConnectionCount加一,這個(gè)badConnectionCount是記錄無效的數(shù)據(jù)庫連接信息的

總結(jié)

本篇文章主要介紹了PooledConnection和PooledDataSource的pushConnection()方法,PooledConnection用到了jdk的動(dòng)態(tài)代理,生成Connection的實(shí)現(xiàn)類的代理類,攔截的邏輯中對(duì)于close()方法沒有真正關(guān)閉,而是把數(shù)據(jù)庫連接信息放入連接池中供下次再使用,數(shù)據(jù)庫連接信息放入連接池的過程是通過調(diào)用PooledDataSource的pushConnection()來完成的,具體就是從活躍連接集合中刪除這個(gè)連接,然后放入空閑連接數(shù)集合中并把當(dāng)前連接設(shè)置為無效。

到此這篇關(guān)于詳解Mybatis中的PooledDataSource的文章就介紹到這了,更多相關(guān)Mybatis PooledDataSource內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Feign調(diào)用注解組件(實(shí)現(xiàn)字段賦值功能)

    使用Feign調(diào)用注解組件(實(shí)現(xiàn)字段賦值功能)

    這篇文章主要介紹了使用Feign調(diào)用注解組件(實(shí)現(xiàn)字段賦值功能),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java構(gòu)造器(構(gòu)造方法)能否可以被重寫

    Java構(gòu)造器(構(gòu)造方法)能否可以被重寫

    這篇文章主要介紹了Java構(gòu)造器(構(gòu)造方法)能否可以被重寫問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • java并發(fā)之Lock接口的深入講解

    java并發(fā)之Lock接口的深入講解

    從Java 5之后,在java.util.concurrent.locks包下提供了另外一種方式來實(shí)現(xiàn)同步訪問.那就是Lock,這篇文章主要給大家介紹了關(guān)于java并發(fā)之Lock接口的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Spring中網(wǎng)絡(luò)請(qǐng)求客戶端WebClient的使用詳解

    Spring中網(wǎng)絡(luò)請(qǐng)求客戶端WebClient的使用詳解

    作為替代,Spring 官方已在 Spring 5 中引入了 WebClient 作為非阻塞式 Reactive HTTP 客戶端,本文將通過樣例演示如何使用 WebClient,希望對(duì)大家有所幫助
    2024-04-04
  • 利用mysql實(shí)現(xiàn)的雪花算法案例

    利用mysql實(shí)現(xiàn)的雪花算法案例

    這篇文章主要介紹了利用mysql實(shí)現(xiàn)的雪花算法案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java判斷是否為圖片的步驟和方法

    java判斷是否為圖片的步驟和方法

    在本篇內(nèi)容里小編給大家分享的是關(guān)于java判斷是否為圖片的做法和步驟,需要的朋友們學(xué)習(xí)下。
    2018-12-12
  • springboot中使用過濾器,jsoup過濾XSS腳本詳解

    springboot中使用過濾器,jsoup過濾XSS腳本詳解

    這篇文章主要介紹了springboot中使用過濾器,jsoup過濾XSS腳本詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring-全面詳解(學(xué)習(xí)總結(jié))

    Spring-全面詳解(學(xué)習(xí)總結(jié))

    這篇文章主要介紹了詳解Spring框架入門,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望能給你帶來幫助
    2021-07-07
  • Java8到Java19的一些變化分析詳解

    Java8到Java19的一些變化分析詳解

    這篇文章主要為大家介紹了Java8到Java19的一些變化分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 詳解Spring Cloud Feign 熔斷配置的一些小坑

    詳解Spring Cloud Feign 熔斷配置的一些小坑

    這篇文章主要介紹了詳解Spring Cloud Feign 熔斷配置的一些小坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04

最新評(píng)論

海城市| 天镇县| 达孜县| 贵溪市| 开原市| 蒙阴县| 抚州市| 长泰县| 湘潭县| 马尔康县| 延长县| 嘉义县| 镇坪县| 赤水市| 济宁市| 南木林县| 治多县| 洛扎县| 万盛区| 金坛市| 太仆寺旗| 宁德市| 库伦旗| 临洮县| 阳东县| 霍邱县| 石景山区| 汉阴县| 友谊县| 万山特区| 汝州市| 马边| 天峨县| 孟连| 太康县| 延边| 常德市| 耿马| 锡林浩特市| 南靖县| 涿州市|