数据库

sql.DB连接池需知:

  • sql.DB内置连接池,连接不足时会自动创建新连接,新创建的连接使用sql.Open()时传入的dsn来构造。
  • sql.DBClose时只会关闭连接池中的连接,未归还的连接将会在归还时直接关闭。
  • 归还连接时,不会将bad connections放回连接池,会直接关闭。
  • sql.DB的Query/Exec/Ping/Prepare/Begin操作会从连接池取一条连接或者直接创建新的连接,然后在新连接上操作。
  • sql.DB的Query/Exec/Ping/Prepare/Begin等操作取连接时遇到bad connections最多尝试2次,若依然报bad connections错则直接创建新连接。
  • sql.DB即使使用USE dbname切换了库,但是Query和Exec等操作会从连接池取(不确定取出的连接连向哪个db)或创建连接(连哪个db或者不连db依据dsn)。
  • Query占有的连接,在Rows.Next()遍历完成或Rows.Close()调用后释放。
  • QueryRow占有的连接,在Row.Scan()调用后释放。
  • Begin开启事务后Tx占有的连接,在Tx.Commit()Tx.Rollback()后释放。
  • Exec/Ping/Prepare都是执行完直接释放连接
  • sql.Conn和sql.Tx的Query/Exec/Ping/Prepare都是在当前连接上执行操作,不会另获取新连接。
  • 同一个sql.Conn/sql.Tx的QueryExec不要一个操作未完成就执行另一个操作,否则容易报错(busy buffer)
SetMaxOpenConns()

默认无限制
设置最大打开的连接数,若到达则会阻塞操作,直到其他连接释放。

SetConnMaxLifetime()

默认为2
设置连接池最大闲置连接数,若到达则归还的连接会直接关闭。

SetConnMaxLifetime()

如果小于0,则永不过期
闲置连接的最大生命周期,应小于数据库连接的超时时间。
从连接创建时计时或连接池取连接时重新计时,连接只有在连接池中超时才会被清理掉。

Conn()

从连接池取出或者创建一个连接返回。在返回的sql.Conn上Ping,Exec,Query,QueryRow,Begin都是在当前连接上操作。

注意:
sql.Conn连接关闭,会阻塞等连接上的事务完成,直到Tx.Commit()或者Tx.Rollback()。

golang sql.DB的更多相关文章

  1. Golang SQL连接池梳理

    目录 一.如何理解数据库连接 二.连接池的工作原理 三.database/sql包结构 四.三个重要的结构体 4.1.DB 4.2.driverConn 4.3.Conn 五.流程梳理 5.1.先获取 ...

  2. ent 基本使用十一 sql.DB 集成

    这个功能是github中大家提的比较多的一个,所以官方也暴露了相关的api 配置sql.DB 一种方式 package main ​ import ( "time" ​ " ...

  3. 亲测可用的golang sql例程与包管理

    sqlite与golang package main import ( "database/sql" "fmt" "time" _ &quo ...

  4. golang sql database drivers

    https://github.com/golang/go/wiki/SQLDrivers SQL database drivers The database/sql and database/sql/ ...

  5. 使用Automation将Azure SQL DB容灾到本地

    前段时间有个客户有如下需求,将Azure SQL Database数据库容灾到本地(备份频率1小时/次). 那么对于这样的需求,我们可以使用Azure Automation来实现自动化备份到本地. 大 ...

  6. Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper

    Golang中操作数据库已经有现成的库"database/sql"可以用,但是"database/sql"只提供了最基础的操作接口: 对数据库中一张表的增删改查 ...

  7. 在Golang中如何正确地使用database/sql包访问数据库

    本文记录了我在实际工作中关于数据库操作上一些小经验,也是新手入门golang时我认为一定会碰到问题,没有什么高大上的东西,所以希望能抛砖引玉,也算是对这个问题的一次总结. 其实我也是一个新手,机缘巧合 ...

  8. 关于Golang中database/sql包的学习

    go-sql-driver 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. db.Exec() 调用完毕后会马上把连接 ...

  9. golang语言sql Rows转化保存成map

    func DoQuery(db *sql.DB, sqlInfo string, args ...interface{}) ([]map[string]interface{}, error) { ro ...

随机推荐

  1. Sprint2-2.0

    1.开始一个新的冲刺: 起止:2016.6.1~2016.6.14 按照以下过程进行 ProductBacklog:继续向下细化 Sprint 计划会议:确定此次冲刺要完成的目标 Sprint Bac ...

  2. HDU 2106 母猪的故事

    http://acm.hdu.edu.cn/showproblem.php?pid=2160 Problem Description 话说现在猪肉价格这么贵,著名的ACBoy 0068 也开始了养猪生 ...

  3. how to disabled iframe page open new window / new tab

    how to disabled iframe page open new window / new tab 禁用 iframe 中的页面打开新页面 <!DOCTYPE html> < ...

  4. 如何规范 CSS 的命名和书写

    我开始学前端的时候也是对于规范问题头疼,后来看了网易的NEC规范,惊呼牛逼 NEC : 更好的CSS样式解决方案 只遵循横向顺序即可,先显示定位布局类属性,后盒模型等自身属性,最后是文本类及修饰类属性 ...

  5. iOS 数组和字典排序

    一.数组排序 数组排序方式1: //初始化可变数组 NSMutableArray *arr1=[NSMutableArray arrayWithObjects:@"giu",@&q ...

  6. 015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别

    作者:nnngu GitHub:https://github.com/nnngu 博客园:http://www.cnblogs.com/nnngu 简书:https://www.jianshu.com ...

  7. Little Elephant and Array CodeForces - 220B(莫队)

    给一段长为n的序列和m个关于区间的询问,求出每个询问的区间中有多少种数字是 该种数字出现的次数等于该数字 的. #include <iostream> #include <cstdi ...

  8. 【转】arm-none-linux-gnueabi-gcc下载

    arm-none-linux-gnueabi-gcc是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具.可用于交叉编译ARM系统中所有环节的代码,包括 ...

  9. BZOJ4727 [POI2017]Turysta 【竞赛图哈密顿路径/回路】

    题目链接 BZOJ4727 题解 前置芝士 1.竞赛图存在哈密顿路径 2.竞赛图存在哈密顿回路,当且仅当它是强联通的 所以我们将图缩点后,拓扑排序后一定是一条链,且之前的块内的点和之后块内的点的边一定 ...

  10. 使用LD_Preload的Linux权限升级技巧

      0x00 前言 共享库是程序在启动时加载的库.正确安装共享库后,之后启动的所有程序将自动使用新的共享库. 0x01 共享库名称 每个共享库都有一个名为soname的特殊名称.soname有前缀li ...