データベース接続プール

こんにちは、habralyudi!

2週間前、私は若手のJava開発者として働き始め、それに応じて、自分自身に多くの新しい経験を得ました。 今日、私はビジネスと喜びを結び付け、この経験を書面で考え始めることを決心しました-私が自分のジュニアパスで出会ったそれらのテクノロジー、原則、およびテクニックについての記事の形で。 次の記事は似たようなものの中で最初のものであり、ここでそれをレイアウトします。まず、habrasocietyがそのようなものを必要とするかどうかを理解することを望みます-経験や賢明な何百ものプロジェクトでは賢明ではないが、後輩から後輩への経験を共有する小さな試み-いつものように、コメント、訂正、批判を聞いてください。

ご清聴ありがとうございました。



最新のWebアプリケーションの大部分は、データベースを使用して情報を保存します。 アプリケーションは、データベース接続を使用してデータベースと情報を交換できます。 データベースにアクセスするたびに作成すると、時間のロスが発生します。トランザクションの作成には数ミリ秒かかりますが、接続の作成には最大数秒かかる場合があります。 一方、単一の接続を作成し(たとえば、「 Singleton 」テンプレートを使用して)、それを介してのみデータベースにアクセスできます。 しかし、このソリューションには、高負荷の場合に問題が伴います。同時に、100人のユーザーが1つの接続を使用してデータベースにアクセスしようとすると、キューが形成され、アプリケーションのパフォーマンスに悪影響を及ぼします。



データベース接続プール(dbcp)は、上記の問題を解決する方法です。 データベースへの接続の特定のセット(「プール」)を自由に使用できることを意味します。 新しいユーザーがデータベースへのアクセスを要求すると、このプールから既に開かれている接続が与えられます。 開いているすべての接続がすでに取得されている場合、新しい接続が作成されます。 ユーザーが既存の接続の1つを解放するとすぐに、他のユーザーが使用できるようになります。 接続が長時間使用されない場合、接続は閉じられます。



最も単純な接続プールの実装例は、java.sun.comの公式Webサイトで確認できます。 接続プーリング



このアプローチはエンタープライズおよびWebアプリケーションに最も役立つため、Apache Tomcatのような一般的なサーブレットコンテナがdbcpを作成するための独自のソリューションを提供するのは論理的です。 ソリューションはapache-commons-dbcpライブラリに基づいています 。 アプリケーションで接続プールのサポートを実装するには、いくつかの手順を実行する必要があります。



まず、アプリケーションのコンテキストで新しいリソースを宣言する必要があります。 リソース(この場合はデータベース)は、次のコードで記述されます。



<Resource name="jdbc/appname" auth="Container"

type="javax.sql.DataSource" maxActive="100"

maxIdle="30" maxWait="10000"

username="username"

password="password"

driverClassName="jdbc.driver.name"

url="jdbc:protocol://hostname:port/dbname"/>








説明は必要ないと思います。



アプリケーションコンテキストは、XMLファイルによって記述されます。 %document_root%/ META-INF / context.xmlに保存するのが正しいと思いますが、これが唯一のオプションではありません。 コンテキストの詳細については、Tomcat Webサイト: Context Containerをご覧ください。



次に、web.xmlでこのリソースへのリンクを追加する必要があります。



<resource-ref>

DB Connection

<res-ref-name>jdbc/appname</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>








これで、アプリケーションでこのリソースを使用できます。 Connectionオブジェクトを取得してSQLコードを実行するには、次のコードを使用します。



InitialContext initContext= new InitialContext();

DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/dbconnect");

Connection conn = ds.getConnection();








データソース(データソース)を取得するには、JNDIメカニズムが使用されます(詳細については、 こちらを参照してください )。



それだけです! これで、conn.createStatement()を実行し、データベースを操作するロジックを実装できます。 最終的には、通常どおり、接続を閉じる必要があります(conn.close())が、JDBCドライバーを介した通常の接続とは異なり、この接続は実際には閉じません。プール内で空きとしてマークされ、後で再利用できます。 接続をプールに返す前に、この接続を使用して受信したすべてのStatementおよびResultSetは、APIに従って自動的に閉じられます(コメントについてはColwinに感謝します)。



All Articles