2016-11-14 61 views
2

我在我的Web API應用程序中有一組函數。他們對Postgres數據庫中的數據執行一些操作。如何在Go應用程序中處理打開/關閉Db連接?

func CreateUser() { 
    db, err := sql.Open("postgres", "user=postgres password=password dbname=api_dev sslmode=disable") 
    // Do some db operations here 
} 

我想功能應該與DB彼此獨立地工作,所以現在我有sql.Open(...)每個函數內。我不知道這是否是管理數據庫連接的正確方法。

我應該在應用程序啓動時將其打開,並將db作爲參數傳遞給相應的函數,而不是在每個函數中打開連接?

回答

4

每次需要時打開數據庫連接都是浪費資源,速度很慢。

相反,您應該在應用程序啓動時(或首次請求時)創建sql.DB一次,並將其傳遞到需要的地方(例如作爲函數參數或通過某種上下文),或者將其全局化變量,所以每個人都可以訪問它。從多個goroutines呼叫是安全的。

sql.Open()的文檔引用:

返回的數據塊是由多個夠程同時使用安全和維護它自己的空閒連接池。因此,Open函數應該只調用一次。很少有必要關閉數據庫。

你可以使用一個包init()函數初始化:

var db *sql.DB 

func init() { 
    var err error 
    db, err = sql.Open("yourdriver", "yourDs") 
    if err != nil { 
     log.Fatal("Invalid DB config:", err) 
    } 
} 

這裏有一點要注意的是,sql.Open()可能無法創建你的數據庫的實際連接,它可能只是驗證它的參數。爲了測試你是否能真正連接到數據庫,通過定義使用DB.Ping(),例如:

func init() { 
    var err error 
    db, err = sql.Open("yourdriver", "yourDs") 
    if err != nil { 
     log.Fatal("Invalid DB config:", err) 
    } 
    if err = db.Ping(); err != nil { 
     log.Fatal("DB unreachable:", err) 
    } 
} 
+0

'這是很少需要關閉DB.'所以它並沒有被關閉?並隨時打開連接? –

+1

@GujaratSantana是的,強烈建議不要一直關閉和重新打開數據庫連接。如果數據庫更改(例如數據庫名稱,主機或認證信息更改),則只需關閉數據庫連接。或者當你的應用程序退出。 – icza

相關問題