Go database/sqlチュートリアルのコネクションプールの日本語意訳になります。
コネクションプール
database/sql
パッケージには基本的なコネクションプーリング機能があります。制御したり管理したりする機能はあまりありませんが、知っておくと便利なことをいくつか紹介します。
- コネクションプーリングとは、1つのデータベース上で2つの連続したステートメントを実行すると、2つのコネクションをオープンし、別々に実行する可能性があることを意味します。コードがうまく動かずにプログラマが混乱することがよくあります。例えば、
LOCK TABLES
の後のINSERT
はブロックされる可能性があります。なぜならそのINSERT
はテーブルロックをしていないコネクション上で実行されるからです。 - コネクションは必要に応じて作成され、プール内には空いているコネクションはありません。
- デフォルトではコネクション数に制限はありません。もし一度にたくさんのことをする場合は、任意の数のコネクションを作成することができます。これによって「too many connections.」等のエラーを引き起こす可能性があります。
- Go1.1以降では、
db.SetMaxIdleConns(N)
を使ってプール内のアイドルコネクションの数を制限することができます。ただしプール内の全コネクションの数は制限されません。 - Go1.2.1以降では、
db.SetMaxOpenConns(N)
を使ってデータベースへの全コネクション数を制限できます。残念ながら、デッドロックバグのせいで 1.2で安全に使うことができなくなりました。(修正済み) - コネクションはとても早く再生成されます。
db.SetMaxIdleConns(N)
で大きめのアイドルコネクション数を設定することでこの再生成を減らすことができ、再利用のためのコネクションを維持できます。 - コネクションを長時間アイドル状態にしておくと問題が起こる可能性があります(Microsoft Azure上のMySQLでの問題と同様)。 もしアイドル状態が非常に長いために接続タイムアウトが発生している場合は、
db.SetMaxIdleConns(0)
を試してみてください。
前章: カラムが不明な場合
次章: 想定外・アンチパターン・制限