2016-11-14 7 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 
} 

私は機能が互いに独立してデシベルで動作するはずと仮定し、今私は、各関数内sql.Open(...)を持っています。 db接続を管理する正しい方法であるかどうかはわかりません。

アプリケーションが開始されたら、どこかで開く必要があります。すべての関数で接続を開く代わりに、対応する関数の引数としてdbを渡しますか?

答えて

4

必要になるたびにdb接続を開くと、リソースが浪費され、処理が遅くなります。

代わりに、アプリケーションの起動時(または最初の要求時)にsql.DBを作成し、必要な場所(関数パラメータやコンテキストなど)に渡すか、単純にグローバルにします誰もがそれにアクセスすることができます。複数のgoroutineから呼び出すことは安全です。 sql.Open()のドキュメントから引用

返さDBは、複数のゴルーチンによる同時使用のために安全であり、アイドル接続の独自のプールを維持します。したがって、Open関数は一度呼び出される必要があります。 DBを閉じる必要はほとんどありません。

あなたはそれを初期化するために、パッケージ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への実際の接続を作成することはできません、それだけでその引数を検証することができるということです。それは閉じられている必要はありませんので、あなたが実際にDBに接続できるかどうかの定義によって、例えば:

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.Ping()を使用し、テストするには 'DB.'を閉鎖する必要はほとんどありませんか?いつでも接続を開くことができますか? –

+1

@GujaratSantanaはい、常時DB接続を閉じて再オープンしないことを強く推奨します。 dbの変更(データベース名、ホスト、認証情報の変更など)が必要な場合にのみ、db接続を閉じる必要があります。またはあなたのアプリが終了するとき。 – icza

関連する問題