golang sql.DB
数据库
sql.DB连接池需知:
- sql.DB内置连接池,连接不足时会自动创建新连接,新创建的连接使用
sql.Open()时传入的dsn来构造。 - sql.DB
Close时只会关闭连接池中的连接,未归还的连接将会在归还时直接关闭。 - 归还连接时,不会将
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的
Query和Exec不要一个操作未完成就执行另一个操作,否则容易报错(busy buffer)
SetMaxOpenConns()
默认无限制
设置最大打开的连接数,若到达则会阻塞操作,直到其他连接释放。
SetConnMaxLifetime()
默认为2
设置连接池最大闲置连接数,若到达则归还的连接会直接关闭。
SetConnMaxLifetime()
如果小于0,则永不过期
闲置连接的最大生命周期,应小于数据库连接的超时时间。
从连接创建时计时或连接池取连接时重新计时,连接只有在连接池中超时才会被清理掉。
Conn()
从连接池取出或者创建一个连接返回。在返回的sql.Conn上Ping,Exec,Query,QueryRow,Begin都是在当前连接上操作。
注意:
sql.Conn连接关闭,会阻塞等连接上的事务完成,直到Tx.Commit()或者Tx.Rollback()。
golang sql.DB的更多相关文章
- Golang SQL连接池梳理
目录 一.如何理解数据库连接 二.连接池的工作原理 三.database/sql包结构 四.三个重要的结构体 4.1.DB 4.2.driverConn 4.3.Conn 五.流程梳理 5.1.先获取 ...
- ent 基本使用十一 sql.DB 集成
这个功能是github中大家提的比较多的一个,所以官方也暴露了相关的api 配置sql.DB 一种方式 package main import ( "time" " ...
- 亲测可用的golang sql例程与包管理
sqlite与golang package main import ( "database/sql" "fmt" "time" _ &quo ...
- golang sql database drivers
https://github.com/golang/go/wiki/SQLDrivers SQL database drivers The database/sql and database/sql/ ...
- 使用Automation将Azure SQL DB容灾到本地
前段时间有个客户有如下需求,将Azure SQL Database数据库容灾到本地(备份频率1小时/次). 那么对于这样的需求,我们可以使用Azure Automation来实现自动化备份到本地. 大 ...
- Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper
Golang中操作数据库已经有现成的库"database/sql"可以用,但是"database/sql"只提供了最基础的操作接口: 对数据库中一张表的增删改查 ...
- 在Golang中如何正确地使用database/sql包访问数据库
本文记录了我在实际工作中关于数据库操作上一些小经验,也是新手入门golang时我认为一定会碰到问题,没有什么高大上的东西,所以希望能抛砖引玉,也算是对这个问题的一次总结. 其实我也是一个新手,机缘巧合 ...
- 关于Golang中database/sql包的学习
go-sql-driver 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. db.Exec() 调用完毕后会马上把连接 ...
- golang语言sql Rows转化保存成map
func DoQuery(db *sql.DB, sqlInfo string, args ...interface{}) ([]map[string]interface{}, error) { ro ...
随机推荐
- 如何快速地编写和运行一个属于自己的 MapReduce 例子程序
大数据的时代, 到处张嘴闭嘴都是Hadoop, MapReduce, 不跟上时代怎么行? 可是对一个hadoop的新手, 写一个属于自己的MapReduce程序还是小有点难度的, 需要建立一个mave ...
- java如何写入txt文件
public class TxtWrite { public static void main(String args[]){ contentToTxt("D:\\xyky.txt" ...
- [Oracle] 11.2.0.1 的客户端无法连接12.2.0.1 的DB端 28040
最近有一个应用服务器安装上了 11.2.0.1 的oracle DB端 又想当 客户端用来 注册 oracle12.2.0.1的DB端发现不行 但是很奇怪 报的错误竟然是 ora 01017 密码错误 ...
- 网页正文提取,降噪的实现(readability/Document)
安装: pip install readability-lxml 使用: # encoding:utf-8import html2textimport requestsimport refrom re ...
- GCC 提供的原子操作
gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作. 其声明如下: type __sync_fetch_and_add (type *ptr, typ ...
- ACdream1093
给你三种正多面体,正四面体,正六面体,正八面体.求从某一种正多面体中的某一点走到另一个点,且步数不超过k(1018)的方案数. 首先说明一下我交题的时候遇到的问题,起点和终点为同一点的时候,算不算走了 ...
- java传统的文件拷贝 相当于两个大缸需要通过一个勺子(字节数组)一点一点运过去
- DAY7-Flask项目
1.cookie用于用户登录: Flask用于登录的插件:flask-login 插件初始化: 使用插件: 2.访问权限: 访问某个页面要登录之后才能访问: 为插件编写函数,写在user模块中:
- expect ssh 自动登录 example
#!/usr/bin/expect -f set ip [lindex $argv ] set port [lindex $argv ] set username [lindex $argv ] se ...
- Python之旅:元组
作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读#定义:与列表类型比,只不过[]换成()age=(11,22,33,44,55)本质age=tuple((11,22, ...