美文网首页
database/sql包连接池解读

database/sql包连接池解读

作者: qinxiuchen | 来源:发表于2017-07-18 19:36 被阅读0次

连接池是做网络应用经常用到的一个概念,可以缓存连接减少创建连接的损耗。那么在golang中应该如何做一个连接池,在这里会通过解读<a href="https://golang.org/pkg/database/sql/">database/sql</a>包的连接池实现来给自己一些参考和启发。
首先,需要了解database/sql的基本原理和使用方法,请参考下面的链接仔细阅读:http://go-database-sql.org/overview.html
接下来分析下建立新连接的基本流程:

database/sql连接池分析-1.jpg

然后是释放连接的基本流程:

database/sql连接池分析-2.jpg

最后,有几个关键函数也想说明一下:
在调用sql.Open的时候,会创建一个协程“go db.connectionOpener()“

// Runs in a separate goroutine, opens new connections when requested.
func (db *DB) connectionOpener() {
    for range db.openerCh {
        db.openNewConnection()
    }
}

那这个函数是做什么用的呢?我们发现有db.openerCh,用到这个channel的函数只有db.maybeOpenNewConnections()函数

func (db *DB) maybeOpenNewConnections() {
    numRequests := len(db.connRequests)
    if db.maxOpen > 0 {
        numCanOpen := db.maxOpen - db.numOpen
        if numRequests > numCanOpen {
            numRequests = numCanOpen
        }
    }
    for numRequests > 0 {
        db.numOpen++ // optimistically
        numRequests--
        if db.closed {
            return
        }
        db.openerCh <- struct{}{}
    }
}

maybeOpenNewConnections只有在创建连接失败或者释放连接失败或者发生error的时候才会调用,这样就能够保证不会有阻塞的获取连接的请求得不到资源。例如释放连接时,发生了错误,此时有阻塞的获取连接请求,如果直接返回,那么等待池会继续阻塞。此时就可以调用maybeOpenNewConnections函数建立新的连接。

相关文章

  • database/sql包连接池解读

    连接池是做网络应用经常用到的一个概念,可以缓存连接减少创建连接的损耗。那么在golang中应该如何做一个连接池,在...

  • database/sql包

    gorm构建在标准库database/sql上,所以需要先对database/sql有所了解。以下内容大部分取自g...

  • Go语言数据库驱动程序基础构建指南(二)

    What is database/sql? database/sql是Go语言标准库里的一个函数包。它使用官方通用...

  • dive into golang database/sql(2)

    当我们拿到一个DB实例之后就可以操作数据库了。本篇我们将更加深入database/sql包,共同探讨连接池的维护和...

  • 1 Go 数据库IO(一):Mysql操作

    Go使用Mysql 1.database/sql标准包 sql包提供了保证SQL或类SQL数据库的泛用接口。使用s...

  • Go database/sql文档

    No.1 文档概要 在Golang中使用SQL或类似SQL的数据库的惯用方法是通过 database/sql 包操...

  • Druid源码阅读4-DruidDataSource的getCo

    DruidDataSource连接池实现了javaX.sql包中,DataSource接口的全部方法。getCon...

  • GO database/sql

    database/sql http://golang.org/pkg/database/sql/[http://g...

  • JAVA学习笔记(JDBC)

    1.java.sql包是JDBC的核心类和接口 2.javax.sql数据库连接池、数据源、JNDI和RowSet...

  • DBCP

    分类说明名称DBCP全称Database Connection Pool功能数据库连接池 连接池 数据库连接池是一...

网友评论

      本文标题:database/sql包连接池解读

      本文链接:https://www.haomeiwen.com/subject/itnhkxtx.html