golang的全局聲明的生命周期

場景:

當我們要進行redis操作或者其他中間件操作的時候,為了少發起服務端的連接,我們會在main函數外先建立連接,以減少服務端的連接次數

真相:

事實上,很多中間件的連接只是一個語法聲明,其實并沒有進行真正的連接,比如下面的代碼

package main

import (
  "fmt"
  "github.com/garyburd/redigo/redis"
  "github.com/spf13/cast"
  "math/rand"
  "time"
)

var (
  rds, errxx = redis.Dial("tcp", "1.1.1.1:3333")
)

func Do(i int) {
  fmt.Println("開始進行redis操作...")
  act, err := rds.Do("SET", "name" + cast.ToString(i), i)
  fmt.Println(act, "--------", err)
}


func main() {
  ticker := time.NewTicker(3 * time.Second)
  defer ticker.Stop()

  for {
    select {
    case <-ticker.C:
      Do(rand.Intn(1000))
    }
  }
}

事實上每一個操作redis的時候,都會對redis重新發起一次連接,并沒有起到減少連接的作用

驗證

運行上面的程序, 然后觀察redis的數據寫入, 在寫入一些數據之后,我們停止redis的服務,程序就會報錯

use of closed network connection

可見即使是放在main函數外的中間件句柄, 也只是一個聲明(redis, mysql等都是,其他還沒測試),并沒有進行真正的連接,所以要減少發起連接的次數,還是乖乖的用連接池吧。

本文鏈接:參與評論 ?

--EOF--

專題「編程語言」的其它文章 ?

Comments

toto足球指数