データベース接続とは、コンピュータ科学における機能の一つで、クライアントソフトウェアがデータベースサーバーソフトウェアと通信できるようにするものです。通信は、同一マシン上にあるか否かを問わず行われます。コマンドを送信し、応答(通常は結果セットの形式)を受信するには、接続が必要です。
接続は、データ中心型プログラミングにおける重要な概念です。一部のDBMSエンジンは接続にかなりの時間を要するため、パフォーマンス向上のために接続プーリングが考案されました。データベースへの「オープンで利用可能な」接続がなければ、データベースに対してコマンドを実行することはできません。
接続は、基盤となるドライバまたはプロバイダに接続文字列を提供することによって確立されます。接続文字列は、特定のデータベースまたはサーバーとインスタンス、およびユーザー認証資格情報を指定する方法です(例: Server= sql_box; Database= Common; User ID= uid; Pwd= password;)。接続が確立されると、必要に応じて接続を開閉でき、コマンドのタイムアウト時間やトランザクション(存在する場合)などのプロパティを設定できます。接続文字列は、使用するデータアクセスインターフェイスとデータプロバイダによって規定される一連のキー/値ペアで構成されます。
多くのデータベース( PostgreSQLなど)では、接続ごとに一度に実行できる操作は1つだけです。データベースにデータ要求(SQL SELECT文)が送信され、結果セットが返されると、接続は開いたままになりますが、クライアントが結果セットの処理を完了するまで、他の操作は実行できません。SQL Server 2005(以降)などの他のデータベースでは、このような制限はありません。ただし、接続ごとに複数の操作を実行できるデータベースは、一度に1つの操作しか実行できないデータベースよりも、通常はるかに多くのオーバーヘッドが発生します。
データベース接続は有限でコストがかかり、接続の作成に、実行される操作に比べて不釣り合いに長い時間がかかる場合があります。アプリケーションがデータベースを更新するたびにデータベース接続を作成、使用、および閉じるのは非効率的です。
コネクションプーリングは、この問題を軽減するために設計された手法です。データベース接続のプールを作成し、データベースへのアクセスが必要なアプリケーション間で共有することができます。
接続プールから取得される接続オブジェクトは、多くの場合、実際のデータベース接続をラップしたものです。このラッパーはプールとの関係を理解し、プールの詳細をアプリケーションから隠蔽します。例えば、ラッパーオブジェクトは、データベース接続の「close」メソッドと同様に呼び出せる「close」メソッドを実装できます。データベース接続のメソッドとは異なり、ラッパーのメソッドはデータベース接続を実際に閉じるのではなく、プールに返します。アプリケーションは、ラッパーオブジェクトのメソッドを呼び出す際に、接続プーリングについて意識する必要はありません。
このアプローチでは、アプリケーション内で接続を開いたままにしておくのではなく、必要なときにのみ接続を開き、処理が完了したらすぐに接続を閉じるという方法を推奨しています。このようにすることで、比較的少数の接続で多数のリクエストを処理できます。これは多重化とも呼ばれます。
一方、クライアント/サーバーアーキテクチャでは、サーバーの状態を管理するために、通常は永続的な接続が使用されます。この「状態」には、サーバー側のカーソル、一時的な成果物、接続固有の機能設定などが含まれます。
接続プールがオーバーフローすると、アプリケーション障害が発生します。これは、アプリケーションが接続を要求した時点で、プール内のすべての接続が使用中の場合に発生する可能性があります。たとえば、多数のクライアントがウェブサイトにアクセスしようとした場合、または1つ以上の操作がブロックされたり、非効率になったりした場合に、アプリケーションが接続を長時間使用し続けることが原因となる場合があります。