接続の管理

ほとんどのプログラムでは、sql.DB 接続プールのデフォルト値を調整する必要はありません。しかし、一部の高度なプログラムでは、接続プールのパラメーターを調整したり、接続を明示的に操作したりする必要がある場合があります。このトピックでは、その方法について説明します。

sql.DB データベースハンドルは、複数のゴルーチンによる同時使用に対して安全です(つまり、このハンドルは他の言語で「スレッドセーフ」と呼ばれるものです)。他のデータベースアクセスライブラリの中には、一度に1つの操作しか使用できない接続に基づいているものもあります。このギャップを埋めるために、各 sql.DB は基になるデータベースへのアクティブな接続のプールを管理し、Goプログラムでの並列処理のために必要に応じて新しい接続を作成します。

接続プールは、ほとんどのデータアクセス要件に適しています。sql.DBQuery メソッドまたは Exec メソッドを呼び出すと、sql.DB の実装はプールから利用可能な接続を取得するか、必要に応じて新しい接続を作成します。このパッケージは、不要になった接続をプールに返します。これにより、データベースアクセスの高い並列処理がサポートされます。

接続プールのプロパティの設定

sql パッケージが接続プールを管理する方法をガイドするプロパティを設定できます。これらのプロパティの効果に関する統計を取得するには、DB.Stats を使用します。

オープン接続の最大数の設定

DB.SetMaxOpenConns は、オープン接続の数に制限を課します。この制限を超えると、新しいデータベース操作は既存の操作が終了するまで待機し、その時点で sql.DB は別の接続を作成します。デフォルトでは、接続が必要なときに既存のすべての接続が使用されている場合、sql.DB は常に新しい接続を作成します。

制限を設定すると、データベースの使用がロックまたはセマフォの取得と類似したものになり、その結果、アプリケーションが新しいデータベース接続を待機してデッドロックする可能性があることに注意してください。

アイドル接続の最大数の設定

DB.SetMaxIdleConns は、sql.DB が維持するアイドル接続の最大数の制限を変更します。

特定のデータベース接続でのSQL操作が終了しても、通常はすぐにシャットダウンされません。アプリケーションはすぐに再度必要になる可能性があり、開いている接続を維持することで、次の操作のためにデータベースに再接続する必要がなくなります。デフォルトでは、sql.DB は常に2つのアイドル接続を保持します。この制限を上げると、並列処理が多いプログラムでの頻繁な再接続を回避できます。

接続がアイドル状態を維持できる最大時間の設定

DB.SetConnMaxIdleTime は、接続が閉じられるまでにアイドル状態を維持できる最大時間を設定します。これにより、sql.DB は指定された期間よりも長くアイドル状態であった接続を閉じます。

デフォルトでは、アイドル接続が接続プールに追加されると、再び必要になるまでそこに残ります。並列アクティビティが集中している間に許可されるアイドル接続の数を増やすために DB.SetMaxIdleConns を使用する場合、DB.SetConnMaxIdleTime も使用すると、システムが静かになったときにそれらの接続を後で解放するように手配できます。

接続の最大存続期間の設定

DB.SetConnMaxLifetime を使用すると、接続が閉じられるまでに開いた状態を維持できる最大時間が設定されます。

デフォルトでは、接続は上記で説明した制限に従って、任意の長い時間使用および再利用できます。ロードバランシングされたデータベースサーバーを使用するシステムなど、一部のシステムでは、アプリケーションが特定の接続を再接続せずに長期間使用しないようにすることが役立ちます。

専用接続の使用

database/sql パッケージには、データベースが特定の接続で実行される一連の操作に暗黙的な意味を割り当てる可能性がある場合に使用できる関数が含まれています。

最も一般的な例はトランザクションで、通常は BEGIN コマンドで始まり、COMMIT または ROLLBACK コマンドで終わり、それらのコマンド間の接続で発行されたすべてのコマンドを全体的なトランザクションに含みます。このユースケースでは、sql パッケージのトランザクションサポートを使用してください。トランザクションの実行を参照してください。

個々の操作のシーケンスすべてが同じ接続で実行されなければならない他のユースケースでは、sql パッケージは専用接続を提供します。DB.Conn は、専用接続である sql.Conn を取得します。sql.Conn には、DB の同等のメソッドと同様に動作しますが、専用接続のみを使用する BeginTxExecContextPingContextPrepareContextQueryContext、および QueryRowContext メソッドがあります。専用接続が終了したら、コードは Conn.Close を使用してそれを解放する必要があります。