<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## SQL的連接池速率限制和超時 盡管database/sql包提供了連接池速率限制和超時,調整默認值以更好地適應數據庫配置通常很重要。當你在微服務上進行水平擴展并且不希望保持與數據庫的過多活動連接時,這可能很重要。 ### 實踐 1. 建立 pools.go: ``` package pools import ( "database/sql" "fmt" "os" _ "github.com/go-sql-driver/mysql" ) func Setup() (*sql.DB, error) { db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@/gocookbook?parseTime=true", os.Getenv("MYSQLUSERNAME"), os.Getenv("MYSQLPASSWORD"))) if err != nil { return nil, err } // 僅開放24個連接 db.SetMaxOpenConns(24) // MaxIdleConns不可以比SetMaxOpenConns的值小 否則會將SetMaxOpenConns的值作為默認值 db.SetMaxIdleConns(24) return db, nil } ``` 2. 建立 timeout.go: ``` package pools import ( "context" "time" ) // ExecWithTimeout 使用context來實現超時 func ExecWithTimeout() error { db, err := Setup() if err != nil { return err } ctx := context.Background() // 我們希望立刻超時 ctx, can := context.WithDeadline(ctx, time.Now()) // 在函數完成后調用cancel defer can() // 以當前context為參數 _, err = db.BeginTx(ctx, nil) return err } ``` 3. 建立 main.go: ``` package main import "github.com/agtorre/go-cookbook/chapter5/pools" func main() { if err := pools.ExecWithTimeout(); err != nil { panic(err) } } ``` 4. 這會輸出: ``` panic: context deadline exceeded goroutine 1 [running]: main.main() /go/src/github.com/agtorre/gocookbook/chapter5/pools/example/main.go:7 +0x4e exit status 2 ``` ### 說明 限制數據庫連接池深度非常有用,這將保護數據庫不會超載,不過更重要的是考慮context在這里的使用。如果你強制限制一定數量的連接并嚴格的基于上下文的超時,就像我們在示例中所做的那樣,在某些情況下,會出現有一些請求經常超時并試圖建立過多連接導致程序重載。 這個新加入sql包的函數使得包括查詢在內的請求共享超時更加簡單。 使用全局配置對象傳遞給Setup()函數是有意義的,當然我們在這里使用的是環境變量。 * * * * 學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。 Golang中國(211938256) beego實戰(258969317) Go實踐(386056972)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看