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,表示连接池不会保持释放会连接池中的连接的连接状态:即当连接释放回到连接池的时候,连接将会被关闭。这会导致连接再连接池中频繁的关闭和创建。

对于连接池的使用依赖于你是如何配置连接池,如果使用不当会导致下面问题:

  1. 大量的连接空闲,导致额外的工作和延迟。

  2. 连接数据库的连接过多导致错误。

  3. 连接阻塞。

  4. 连接池有超过十个或者更多的死连接,限制就是10次重连。

####Go语言语法格式,需要注意大小写以及边界,目前学习到此...