メインコンテンツまでスキップ

DB Connection

Overview

コネクション内でのやりとりの開始と終了までの単位をセッション(session)と呼ぶ。

ヒント

コネクションが確立された上にセッションが作られる。という関係が正しい。
この関係が区別されないのは基本的にはコネクションとセッションは1対1に対応しており、コネクションが貼られると同時に暗黙にセッションも開始されセッションを切断すればコネクションも切断されることが多いため。

コネクションの状態は show status コマンドで確認できる。

コネクションプールとは

コネクションプールは、アプリケーション側でデータベースへの接続(コネクション)を効率的に使い回すための仕組み。
接続のたびに毎回DBに対して新しいコネクションを確立するのはオーバーヘッドが大きいため、一定数の接続を事前に確保し、必要に応じてそれらを再利用します。

これは、データベースサーバーそのものの機能ではなく、アプリケーションやミドルウェア、あるいはORMライブラリ(例:TypeORM、Hibernateなど)に内蔵された仕組みであることが多いです。

特徴

  • アプリケーション起動時または初回アクセス時に、一定数のDB接続を確保してプールに保持する
  • クエリの実行時にはプールから接続を借り、終了後にプールに返却する
  • 多数のリクエストを高速かつ安定して処理するために必須の手法
  • ORMを使っている場合でも内部的にこの仕組みが働いていることが多い

このように、コネクションプールはアプリケーションのスケーラビリティとパフォーマンスの観点で重要な役割を果たします。

なぜDBではなくアプリ側の機能なのか

DB側は「接続されるのを待つ」受け身な存在です。 一方で、「どのタイミングで接続を張る/切る/使い回すか」はアプリ側がコントロールします。 そのため、「誰が接続をどう扱うか」を設計・管理するのはアプリケーションです。

コネクションプール

コネクションプールは、データベース接続を効率的に管理するためのテクニック。
アプリケーションがデータベースに接続するたびに、新しい接続を作成する代わりに、コネクションプールから既存の接続を取得して再利用できる。
これにより、接続と切断のたびに発生するオーバーヘッドを削減し、システムのパフォーマンスを向上させることが可能となる。

コネクションプールの利点

  1. 効率性: 接続の確立には時間がかかるため、コネクションプールを使用することで、そのオーバーヘッドを減らすことができる。
  2. スケーラビリティ: 同時に多数のクライアントがデータベースに接続する場合でも、コネクションプールを通じて接続数を制御することで、サーバーの過負荷を防ぐことができる。
  3. リソースの最適化: コネクションプールによって接続が再利用されるため、リソースの使用が最適化される。

コネクションプールとサーバーレス実行環境の問題(Lambda)

AWS Lambdaのようなサーバーレス環境では、コネクションプールを使用する際には注意が必要。
Lambda関数はイベントごとにトリガーされるステートレスなコンテナーで実行されるため、Lambda関数の実行が終了するとコンテナーとそのリソースが廃棄される可能性もある。 つまり、関数がトリガーされるたびに新しいコネクションプールが作成され、既存のプールが再利用されない可能性もある。

そのため、Lambdaでコネクションプールを使用する場合には、以下の点に留意する必要があります:

  • コールドスタート問題: Lambda関数が初めて実行されるとき、新しい接続をプールに追加する必要があるため、レスポンスが遅れる可能性もある。
  • コネクション数の管理: Lambda関数がスケールアウトすると、同時に多数のコネクションがデータベースに張られることがあるため、データベースの接続数の上限に達するリスクもある。

これらの問題を回避するためには、AWSが提供するRDS ProxyやAurora Serverlessなどのサービスを利用する、または、Lambda関数の実行コンテキストを再利用することでコネクションプールを効率的に管理する方法を検討する必要があります。それにより、Lambda関数が実行されるたびに新しいデータベース接続を作成するのではなく、コンテナーの寿命を通じて接続を再利用することが可能。

コネクションプールは通常、アプリケーションサーバー上で動作しているプール管理ライブラリまたはミドルウェアによって管理されます。これはアプリケーションのプロセスメモリ内に存在し、アプリケーションが稼働している間は維持されます。

コネクションプールの管理

コネクションプールを管理する際には以下の要素が重要です:

  • ライフサイクル: プールされた接続は生成、使用、そして再利用または廃棄というライフサイクルを持つ。
  • 数の管理: プールは同時に開くことができる接続数を制御する。
  • 状態の監視: 接続の健全性を確認し、必要に応じて接続を再生成する。

アプリケーションメモリとコネクションプール

コネクションプールは、アプリケーションが使用するメモリスペースに保持されます。アプリケーションが起動すると、プール管理システムは一定数のデータベース接続を確立し、これらの接続をアプリケーションが要求するたびに割り当て、解放された後は再利用できます。

コネクションプールとORM

コネクションプールの概念はORM(Object-Relational Mapping)固有のものではありません。ORMは、オブジェクト指向プログラミングと関係データベース管理システム(RDBMS)の間の橋渡しをするものであり、データベース操作をオブジェクト指向の視点で行えるようにするものです。

しかし、多くのORMライブラリにはコネクションプール機能が組み込まれています。例えば、TypeORMのようなORMは内部的にコネクションプールを使用してデータベース接続を管理でき、アプリケーションのパフォーマンス向上に寄与します。プールの具体的な管理はORMの内部で抽象化されており、開発者はプールのパラメータを設定するだけでよく、個々の接続について細かく管理する必要はありません。