溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

初級篇學(xué)會(huì)插入數(shù)據(jù)

發(fā)布時(shí)間:2020-07-19 20:20:35 來源:網(wǎng)絡(luò) 閱讀:624 作者:DBAspace 欄目:編程語言

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())

}

###

深入內(nèi)部分析原因分析:

1、sql.Open("mysql","dlan:root123@tcp(xx.xx.xx.xx:3306)/aa?charset=utf8")

功能:返回一個(gè)DB對象,DB對象對于多個(gè)goroutines并發(fā)使用時(shí)安全的,DB對象內(nèi)部封裝了連接池

實(shí)現(xiàn):open函數(shù)并沒有創(chuàng)建鏈接,它只是驗(yàn)證參數(shù)是否合法,然后開啟一個(gè)單獨(dú)goroutines去監(jiān)聽是否需要建立新的連接,當(dāng)有請求建立時(shí)就創(chuàng)建

2、db.Query()

用于檢索,比如select

功能:db交給內(nèi)部的Query方法負(fù)責(zé)查詢,query首先調(diào)用db內(nèi)部的conn方法從連接池里獲得一個(gè)連接,然后調(diào)用內(nèi)部的queryConn方法負(fù)責(zé)查詢

db.Query() 調(diào)用完畢后會(huì)將連接傳遞給sql.Rows類型,當(dāng)然后者迭代完畢或者顯示的調(diào)用.Clonse()方法后,連接將會(huì)被釋放回到連接池

3、db.QueryRow()

功能:用于返回單行的查詢

實(shí)現(xiàn):轉(zhuǎn)交給db.Query()查詢

db.QueryRow()調(diào)用完畢后會(huì)將連接傳遞給sql.Row類型,當(dāng).Scan()方法調(diào)用之后把連接釋放回到連接池

4、db.Prepare()

功能:返回一個(gè)Stmt,Stmt對象可執(zhí)行Exec,Query,QueryRow等操作

實(shí)現(xiàn):db交給內(nèi)部的prepare方法負(fù)責(zé)查詢,prepare首先調(diào)用db內(nèi)部的conn方法從連接池里獲得一個(gè)連接,然后調(diào)用driverConn的prepareLocked方法查詢

Stmt相關(guān)方法:

    st.Exec()

    st.Query()

    st.QueryRow()

    st.Close()

5、db.Begin()

功能:開啟事務(wù),返回Tx對象,調(diào)用該方法后,這個(gè)TX就和制定的連接綁定在一起,一旦事物提交或者回滾,該事物綁定的連接就還給db的連接池

實(shí)現(xiàn):db交給內(nèi)部的begin方法負(fù)責(zé)處理,begin首相調(diào)用db內(nèi)部的conn方法從連接池里面獲得一個(gè)連接,然后調(diào)用Conn接口Begin方法獲得一個(gè)TX

TX相關(guān)方法:

    tx.Exec()

    tx.Query()

    tx.QueryRow()

    tx.Prepare()

    tx.Commit()

    tx.Rollback()

    tx.Stmt()//用于將一個(gè)已存在的statement和tx綁定在一起

db.Begin() 調(diào)用完畢后將連接傳遞給sql.Tx類型對象,當(dāng).Commit()或.Rollback()方法調(diào)用后釋放連接

6、db.Ping(): 調(diào)用完畢后會(huì)馬上把連接返回給連接池

7、db.Exec() 調(diào)用完畢后會(huì)馬上把連接返回給連接池,但是它返回的Result對象還保留這連接的引用,當(dāng)后面的代碼需要處理結(jié)果集的時(shí)候連接將會(huì)被重用

配置連接池有兩個(gè)的方法:

db.SetMaxOpenConns(n int) 設(shè)置打開數(shù)據(jù)庫的最大連接數(shù)。包含正在使用的連接和連接池的連接。如果你的函數(shù)調(diào)用需要申請一個(gè)連接,并且連接池已經(jīng)沒有了連接或者連接數(shù)達(dá)到了最大連接數(shù)。此時(shí)的函數(shù)調(diào)用將會(huì)被block,直到有可用的連接才會(huì)返回。設(shè)置這個(gè)值可以避免并發(fā)太高導(dǎo)致連接mysql出現(xiàn)too many connections的錯(cuò)誤。該函數(shù)的默認(rèn)設(shè)置是0,表示無限制。

db.SetMaxIdleConns(n int) 設(shè)置連接池中的保持連接的最大連接數(shù)。默認(rèn)也是0,表示連接池不會(huì)保持釋放會(huì)連接池中的連接的連接狀態(tài):即當(dāng)連接釋放回到連接池的時(shí)候,連接將會(huì)被關(guān)閉。這會(huì)導(dǎo)致連接再連接池中頻繁的關(guān)閉和創(chuàng)建。

對于連接池的使用依賴于你是如何配置連接池,如果使用不當(dāng)會(huì)導(dǎo)致下面問題:

  1. 大量的連接空閑,導(dǎo)致額外的工作和延遲。

  2. 連接數(shù)據(jù)庫的連接過多導(dǎo)致錯(cuò)誤。

  3. 連接阻塞。

  4. 連接池有超過十個(gè)或者更多的死連接,限制就是10次重連。

####Go語言語法格式,需要注意大小寫以及邊界,目前學(xué)習(xí)到此...


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI