package main
import "database/sql"
import "fmt"
import "time"
import _ "github.com/go-sql-driver/mysql"
func main() {
db, e := sql.Open("mysql","dlan:root123@tcp(xx.xx.xx.xx:3306)/aa?charset=utf8")
if e != nil {
fmt.Println ("error")
return
}
fmt.Println("Conn DB OK")
start :=time.Now()
tx,_:=db.Begin()
for i :=1;i<=1000;i++{
fmt.Println(i)
tx.Exec("insert into aa(id,c_type)value(?,?)",i,i+2)
}
tx.Commit()
end :=time.Now()
fmt.Print(end.Sub(start).Seconds())
}
###
深入内部分析原因分析:
1、sql.Open("mysql","dlan:root123@tcp(xx.xx.xx.xx:3306)/aa?charset=utf8")
功能:返回一个DB对象,DB对象对于多个goroutines并发使用时安全的,DB对象内部封装了连接池
实现:open函数并没有创建链接,它只是验证参数是否合法,然后开启一个单独goroutines去监听是否需要建立新的连接,当有请求建立时就创建
2、db.Query()
用于检索,比如select
功能:db交给内部的Query方法负责查询,query首先调用db内部的conn方法从连接池里获得一个连接,然后调用内部的queryConn方法负责查询
db.Query() 调用完毕后会将连接传递给sql.Rows类型,当然后者迭代完毕或者显示的调用.Clonse()方法后,连接将会被释放回到连接池
3、db.QueryRow()
功能:用于返回单行的查询
实现:转交给db.Query()查询
db.QueryRow()调用完毕后会将连接传递给sql.Row类型,当.Scan()方法调用之后把连接释放回到连接池
4、db.Prepare()
功能:返回一个Stmt,Stmt对象可执行Exec,Query,QueryRow等操作
实现:db交给内部的prepare方法负责查询,prepare首先调用db内部的conn方法从连接池里获得一个连接,然后调用driverConn的prepareLocked方法查询
Stmt相关方法:
st.Exec()
st.Query()
st.QueryRow()
st.Close()
5、db.Begin()
功能:开启事务,返回Tx对象,调用该方法后,这个TX就和制定的连接绑定在一起,一旦事物提交或者回滚,该事物绑定的连接就还给db的连接池
实现:db交给内部的begin方法负责处理,begin首相调用db内部的conn方法从连接池里面获得一个连接,然后调用Conn接口Begin方法获得一个TX
TX相关方法:
tx.Exec()
tx.Query()
tx.QueryRow()
tx.Prepare()
tx.Commit()
tx.Rollback()
tx.Stmt()//用于将一个已存在的statement和tx绑定在一起
db.Begin() 调用完毕后将连接传递给sql.Tx类型对象,当.Commit()或.Rollback()方法调用后释放连接
6、db.Ping(): 调用完毕后会马上把连接返回给连接池
7、db.Exec() 调用完毕后会马上把连接返回给连接池,但是它返回的Result对象还保留这连接的引用,当后面的代码需要处理结果集的时候连接将会被重用
配置连接池有两个的方法:
db.SetMaxOpenConns(n int) 设置打开数据库的最大连接数。包含正在使用的连接和连接池的连接。如果你的函数调用需要申请一个连接,并且连接池已经没有了连接或者连接数达到了最大连接数。此时的函数调用将会被block,直到有可用的连接才会返回。设置这个值可以避免并发太高导致连接mysql出现too many connections的错误。该函数的默认设置是0,表示无限制。
db.SetMaxIdleConns(n int) 设置连接池中的保持连接的最大连接数。默认也是0,表示连接池不会保持释放会连接池中的连接的连接状态:即当连接释放回到连接池的时候,连接将会被关闭。这会导致连接再连接池中频繁的关闭和创建。
对于连接池的使用依赖于你是如何配置连接池,如果使用不当会导致下面问题:
大量的连接空闲,导致额外的工作和延迟。
连接数据库的连接过多导致错误。
连接阻塞。
连接池有超过十个或者更多的死连接,限制就是10次重连。
####Go语言语法格式,需要注意大小写以及边界,目前学习到此...
共同学习,写下你的评论
评论加载中...
作者其他优质文章