Javaデータベース接続プール学習


データベース接続プールの原理は次のとおりです.
接続プールの基本的な考え方は、システムが初期化されると、データベース接続をオブジェクトとしてメモリに格納し、ユーザーがデータベースにアクセスする必要がある場合、新しい接続を確立するのではなく、接続プールから確立された空き接続オブジェクトを取り出すことです.使用が完了すると、ユーザーは接続を閉じるのではなく、次のリクエストアクセスのために接続プールに接続を戻します.接続の確立、切断は、接続プール自体が管理します.また、接続プールのパラメータを設定することで、接続プール内の初期接続数、接続の上下限数、接続ごとの最大使用回数、最大アイドル時間などを制御することもできます.データベース接続の数や使用状況などを、独自の管理メカニズムで監視することもできます.
一般的なデータベース接続プール:
よく使われるデータベース接続プールにはJNDI,C 3 p 0,ApacheのJakartaとDBPCPBoneCPがあり,spingフレームワークに依存するサードパーティはc 3 p 0とdbcpの2つの方式を用いている.bonecpは、最も高速なデータベース接続プールと呼ばれています.JNDI方式で実装を作成したdatasourceはjavax.sql.datasourceを実装したものです(他の3つの方法はすべてそうではありません)
ここでは主にJNDI方式の使用方法を紹介します.この方式は、java.sql.datasourceを実現するウェブサーバ(例えば、tomcat、weblogic、websphere、tomcat)によって実現されます.Webサーバがデータソースの初期化、connectionの作成、connectionの割り当て、管理を担当します.Webサーバ自体が実装する機能であるため、プロジェクトに特別なjarパッケージを導入する必要はありませんが、サーバの一部のプロファイルに関連する構成を追加する必要があります.以下では,Tomcatサーバ(データベースはMYSQL)を例に,この方式の使用について述べる.
データベースの作成と初期化データ:
create table test(id INT PRIMARY KEY,name VARCHAR(10),price FLOAT)


INSERT INTO test VALUES(1,'English',22.2);

INSERT INTO test VALUES(2,'Math',78.9);

INSERT INTO test VALUES(3,'History',77.9);

 
1.データドライバmysql-connector-java-5.0.3-bin.jarをtomcatディレクトリのlibに入れる
2.tomcatのconfの下のcontext.xmlファイルを修正し、Resourceの構成のサポートを増やす
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="100" maxIdle="30" maxWait="10000"
 name="jdbc/ewsdb" username="root" password="admin" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/test1"
/>


1)name:ResourceのJNDI名を指定します.
2)auth:ContainerとApplicationの2つのオプション値を持つResourceを管理するManagerを指定します.ContainerはコンテナによってResourceを作成および管理し、ApplicationはWebアプリケーションによってResourceを作成および管理することを示します.
3)type: ResourceのJavaクラス名を指定します.
4)username:データベースに接続するユーザー名を指定します.
5)password:データベースに接続するパスワードを指定します.
6)driverClassName:データベースに接続するJDBCドライブのDriverインプリメンテーションクラスの名前を指定します.
7)url:データベースに接続するURLを指定し、127.0.0.1は接続するデータベースサーバのip、3306はデータベースサーバポート、BookDBはデータベース名である.
8)maxActive:データベース接続プールでアクティブなデータベース接続の最大数を指定します.値は0で、制限されていないことを示します.
9)maxIdle:データベース接続プールでアイドル状態にあるデータベース接続の最大数を指定します.値は0で、制限されていないことを示します.
10)maxWait:データベース接続プール内のデータベース接続がアイドル状態にある最長時間(ミリ秒単位)を指定します.この時間を超えると、例外が放出されます.値は-1で、無期限に待つことができることを示します.
maxActive="100"
接続プールから取得できる接続の最大数を示す.データベースが単独ではなく、アプリケーションで使用される場合、maxActiveパラメータを設定することで、アプリケーションが制限なく接続を取得することが他のアプリケーションに影響を及ぼすことを回避できます.データベースがアプリケーションをサポートするために使用される場合、maxActiveは理論的に、データベースがサポートできる最大接続数に設定できます.maxActiveは、接続プールを介して同時に取得できる最大接続数を表すだけです.接続の取得と解放は双方向であり、アプリケーションが接続プールを同時に要求する場合、接続プールはデータベースから接続を取得する必要がありますが、アプリケーションが接続を使用して接続プールに接続を返した場合、接続プールも同時にデータベースに接続を返しますか?明らかに答えは否定的で、そうすれば接続プールが多くなり、性能を向上させることができないだけでなく、性能を低下させることになりますが、接続を返すように適用した後、接続プールはどのように処理しますか?
maxIdle="30"
同時実行時にmaxActive=100に達した場合、接続プールはデータベースから100個の接続を取得してアプリケーションの使用を供給する必要があります.アプリケーションが接続を閉じると、maxIdle=30になるため、すべての接続がデータベースに返されるわけではありません.接続プール種に30個の接続が保持され、アイドル状態になります.
minIdle=”2”
最小デフォルトでは有効ではありません.接続プールの接続にminIdleが少ない場合、システム監視スレッドは補足機能を開始します.一般的には補足スレッドは開始しません.
質問:maxActiveとmaxIdleの設定方法
理論的にはmaxActiveはアプリケーションの最大同時数に設定すべきであり、これにより、最大同時の場合でもアプリケーションは接続プールから接続を取得することができるが、困難な場合、最大同時数を正確に推定することは困難であり、最大同時数に設定することは最適なサービス品質保証である.
maxIdle対応の接続は、実際には接続プールが保持する長い接続であり、これも接続プールが優位を発揮する部分であり、理論的には長い接続を多く維持し、要求を適用する際により迅速に応答することができるが、接続を多く維持すると、かえってデータベースの大量のリソースを消費するため、maxIdleも大きくなればなるほど良いわけではない.前述の例では、maxIdleを50-100の50に近い数字、例えば55に設定することをお勧めします.これにより、最大同時性を両立させながら、データベース接続を少なく維持でき、ほとんどの場合、アプリケーションに最も速い対応速度を提供できます.
3.アプリケーションのWeb.xmlファイルを開き、以下の構成を追加
<resource-ref>

<description>DB Connection</description>

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

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

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

</resource-ref>

 
プロパティの説明:
1)description:参照されるリソースの説明.
2)res-ref-name:要素のname属性に対応する参照リソースのJNDI名を指定します.
3)res-type:参照するリソースのクラス名を指定し、要素のtype属性に対応します.
4)res-auth:参照するリソースを管理するManagerを指定し、要素のauth属性に対応
4.javaコードを使用し、tomcat環境で使用する
JSPの作成例:MyJsp.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<html>
<head>
<title>Tomcat JNDI      </title>
</head>
<body>
 <%
 try{
  Connection conn;
  Statement stmt;
  ResultSet rs;
  Context ctx = new InitialContext();
  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/ewsdb");
  conn = ds.getConnection();
  stmt = conn.createStatement();
  //    
  rs = stmt.executeQuery("select ID,NAME,PRICE from test");
  //      
  out.println("<table border=1 width=400>");
  while (rs.next()){
   String col1 = rs.getString(1);
   String col2 = rs.getString(2);
   float col3 = rs.getFloat(3);
   //       
   out.println("<tr><td>"+col1+"</td><td>"+col2+"</td><td>"+col3+"</td></tr>");}
   out.println("</table>");

  //     、SQL        
  rs.close();
  stmt.close();
  conn.close();
 }catch(Exception e){
  out.println(e.getMessage());
  e.printStackTrace();
 }
 %>
</body>
</html>

ブラウザにhttp://localhost:8080/test/MyJsp.jspと入力すると、結果が表示されます.