package main
10年積累的做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有無錫免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
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并發(fā)使用時安全的,DB對象內(nèi)部封裝了連接池
實現(xiàn):open函數(shù)并沒有創(chuàng)建鏈接,它只是驗證參數(shù)是否合法,然后開啟一個單獨goroutines去監(jiān)聽是否需要建立新的連接,當(dāng)有請求建立時就創(chuàng)建
2、db.Query()
用于檢索,比如select
功能:db交給內(nèi)部的Query方法負責(zé)查詢,query首先調(diào)用db內(nèi)部的conn方法從連接池里獲得一個連接,然后調(diào)用內(nèi)部的queryConn方法負責(zé)查詢
db.Query() 調(diào)用完畢后會將連接傳遞給sql.Rows類型,當(dāng)然后者迭代完畢或者顯示的調(diào)用.Clonse()方法后,連接將會被釋放回到連接池
3、db.QueryRow()
功能:用于返回單行的查詢
實現(xiàn):轉(zhuǎn)交給db.Query()查詢
db.QueryRow()調(diào)用完畢后會將連接傳遞給sql.Row類型,當(dāng).Scan()方法調(diào)用之后把連接釋放回到連接池
4、db.Prepare()
功能:返回一個Stmt,Stmt對象可執(zhí)行Exec,Query,QueryRow等操作
實現(xiàn):db交給內(nèi)部的prepare方法負責(zé)查詢,prepare首先調(diào)用db內(nèi)部的conn方法從連接池里獲得一個連接,然后調(diào)用driverConn的prepareLocked方法查詢
Stmt相關(guān)方法:
st.Exec()
st.Query()
st.QueryRow()
st.Close()
5、db.Begin()
功能:開啟事務(wù),返回Tx對象,調(diào)用該方法后,這個TX就和制定的連接綁定在一起,一旦事物提交或者回滾,該事物綁定的連接就還給db的連接池
實現(xiàn):db交給內(nèi)部的begin方法負責(zé)處理,begin首相調(diào)用db內(nèi)部的conn方法從連接池里面獲得一個連接,然后調(diào)用Conn接口Begin方法獲得一個TX
TX相關(guān)方法:
tx.Exec()
tx.Query()
tx.QueryRow()
tx.Prepare()
tx.Commit()
tx.Rollback()
tx.Stmt()//用于將一個已存在的statement和tx綁定在一起
db.Begin() 調(diào)用完畢后將連接傳遞給sql.Tx類型對象,當(dāng).Commit()或.Rollback()方法調(diào)用后釋放連接
6、db.Ping(): 調(diào)用完畢后會馬上把連接返回給連接池
7、db.Exec() 調(diào)用完畢后會馬上把連接返回給連接池,但是它返回的Result對象還保留這連接的引用,當(dāng)后面的代碼需要處理結(jié)果集的時候連接將會被重用
配置連接池有兩個的方法:
db.SetMaxOpenConns(n int)設(shè)置打開數(shù)據(jù)庫的最大連接數(shù)。包含正在使用的連接和連接池的連接。如果你的函數(shù)調(diào)用需要申請一個連接,并且連接池已經(jīng)沒有了連接或者連接數(shù)達到了最大連接數(shù)。此時的函數(shù)調(diào)用將會被block,直到有可用的連接才會返回。設(shè)置這個值可以避免并發(fā)太高導(dǎo)致連接mysql出現(xiàn)too many connections的錯誤。該函數(shù)的默認設(shè)置是0,表示無限制。
db.SetMaxIdleConns(n int)設(shè)置連接池中的保持連接的最大連接數(shù)。默認也是0,表示連接池不會保持釋放會連接池中的連接的連接狀態(tài):即當(dāng)連接釋放回到連接池的時候,連接將會被關(guān)閉。這會導(dǎo)致連接再連接池中頻繁的關(guān)閉和創(chuàng)建。
對于連接池的使用依賴于你是如何配置連接池,如果使用不當(dāng)會導(dǎo)致下面問題:
大量的連接空閑,導(dǎo)致額外的工作和延遲。
連接數(shù)據(jù)庫的連接過多導(dǎo)致錯誤。
連接阻塞。
連接池有超過十個或者更多的死連接,限制就是10次重連。
####Go語言語法格式,需要注意大小寫以及邊界,目前學(xué)習(xí)到此...