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 ...
随机推荐
- Beta阶段DAY1
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:了解了自己再beta阶段的安排,但因为考试,有心无力. 林庭亦:颜色设置的相关代码的查看. 郑子熙:和另一位组 ...
- oracle 简单的sysTimeStamp类型转date 类型
oracle 简单的SYSTIMESTAMP 类型转date 类型 SELECT SYSTIMESTAMP , SYSTIMESTAMP+0 FROM dual; SAMPLE_TIME ----- ...
- 浅析Web数据存储-Cookie、UserData、SessionStorage、WebSqlDatabase
Cookie 它是标准的客户端浏览器状态保存方式,可能在浏览器诞生不久就有Cookie了,为什么需要Cookie 这个东东?由于HTTP协议没有状态,所以需要一个标志/存储来记录客户浏览器当前的状态, ...
- 本地存储—localStorage(HTML5)
https://my.oschina.net/jgy/blog/99631 localStorage简介 今夜死活睡不着,决定整理下最近搞得localStorage…… 先简单说下阐述下:localS ...
- JVM内存管理机制
Java与C++之间有一堆由内存动态分配与垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. —— <深入理解Java虚拟机:JVM高级特性与最佳实践> Java虚拟机在 ...
- C# QR二维码DEMO
QR二维码 二维码的一种 相关类库 ThoughtWorks.QRCode 第三方类库 DEMO功能 Encode 生成二维码图片 Encoding 编码 Correction Level 等级 Ve ...
- 【Java并发编程】之九:死锁
当线程需要同时持有多个锁时,有可能产生死锁.考虑如下情形: 线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2.接下来,当线程A仍然持有lock1时,它试图获取lock2,因为线程B ...
- CVPR 2013 关于图像/场景分类(classification)的文章paper list
CVPR 2013 关于图像/场景分类(classification)的文章paper list 八14by 小军 这个搜罗了cvpr2013有关于classification的相关文章,自己得m ...
- 简明Python教程自学笔记——命令行通讯录
[前言]学习Python已经有一段时间了,相关的书籍资料也下载了不少,但是没有一本完整的看完,也没有编出一个完整的程序.今天下午比较清闲就把<简明Python教程>看了一遍,然后根据书里面 ...
- Linux命令之ipcalc
ipcalc命令是一个简单的ip地址计算器,可以完成简单的IP地址计算任务.参数: -b:由给定的IP地址和网络掩码计算出广播地址: -4:ipv4: -6:ipv6: -h:显示给定IP地址所对应的 ...