livewell babyPool howto (javax.sql.DataSourceとして利用する)

javax.sql.DataSourceとして利用する

DataSouceとして利用する場合はほとんどJNDIとセットになるでしょう。JNDIへの登 録の仕方はそれぞれの環境によっても左右されるので代表的な例として Tomcat(version >= 4.0)の場合をあげます(Contextの指定の仕方はTomcatのドキュメ ントを参考にして下さい)。

server.xmlの編集

まず、Tomcatのserver.xmlを編集します。下記の中の2箇所の[your pool name]は xml形式での設定のnameパラメータで指定したプー ル名で置き換えます。

server.xmlの一部
<Context path="[your app path]" ...>
  .
  .
  .
  <Resource name="jdbc/[your pool name]" 
            auth="Container"
            type="jp.livewell.baby.pool.jdbc.ConnectionPool" />
  <ResourceParams name="jdbc/[your pool name]">
    <parameter>
      <name>factory</name>
      <value>jp.livewell.baby.pool.jdbc.DataSourceFactory</value>
    </parameter>
  </ResourceParams>
</Context>
        

以上で設定は終了です。ええそうなんです、本当に簡単なんです。以下にServletか ら利用するコードを書きます。

Servletコードを作成する

Pool名を入力してTomcatのJNDIからDataSourceを取得し、ループして時間を計る Servletを作成します。

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;


/**
 * test for DataSource interface
 *
 * @author mitsuhito
 */
public class Test
    extends HttpServlet 
{
    // form params ------------------------------------------------------------
    /** Pool名のパラメータ名 */
    public static final String PARAM_POOL_NAME = "pool_name";


    // JNDI name --------------------------------------------------------------
    /** JNDIのjdbc prefix */
    public static final String DS_PREFIX = "java:comp/env/jdbc";


    // over rides -------------------------------------------------------------
    /**
     * Pool名を入力するformを表示します。
     *
     * @param	req
     *		Servletコンテナから渡されるhttp request
     * @param	req
     *		Servletコンテナへ戻す、response
     * @throws	IOException
     *		read writeに失敗した時
     * @throws	ServletException
     *		コンテナから渡されたobjectの取扱を間違ったとき(等)
     */
    public void doGet(HttpServletRequest req,
                      HttpServletResponse res)
        throws IOException, ServletException
    {
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();

        out.print("<html><head><title>babyPool servlet</title></head>");
        out.print("<body>");
        out.print("<p>please put DataSource name</p>");
	out.print("<form name=\"test\" action=\"Test\" method=\"post\">");
        out.print("<p>java:comp/env/jdbc/");
        out.print("<input type=\"text\" name=\"" + PARAM_POOL_NAME + "\" />");
        out.print("<input type=\"submit\" name=\"OK\" value=\"OK\" />");
        out.print("</p>");
        out.print("</form>");
        out.print("</body>");
        out.println("</html>");
    }

    /**
     * 指定されたJNDI名にバインドされたDataSourceを取得しConnectionを取得す
     * るループを実行し、結果を表示します。
     *
     * @param	req
     *		Servletコンテナから渡されるhttp request
     * @param	req
     *		Servletコンテナへ戻す、response
     * @throws	IOException
     *		read writeに失敗した時
     * @throws	ServletException
     *		コンテナから渡されたobjectの取扱を間違ったとき(等)
     */
    public void doPost(HttpServletRequest req,
                       HttpServletResponse res)
        throws IOException, ServletException
    {
	String dsName = DS_PREFIX + "/" + req.getParameter(PARAM_POOL_NAME);

        res.setContentType("text/html");
        PrintWriter out = res.getWriter();

        out.print("<html><head><title>babyPool servlet</title></head>");
        out.print("<body>");

	DataSource ds = null; 
	try {
	    InitialContext ictx = new InitialContext();
	    ds = (DataSource) ictx.lookup(dsName);
	} catch (Exception e) {
            out.print("<pre>");
	    e.printStackTrace(out);
            out.print("</pre>");
	} finally {
	    if (ds != null) {
		out.print("<div style=\"color: blue\">");
		out.print("get DataSource success!! name = " + dsName);
		out.print("</div>");
	    } else {
		out.print("<div style=\"color: red\">");
		out.print("fail get DataSource!! name = " + dsName);
		out.print("</div>");
	    }
	    out.flush();
	}


        if (ds != null) {
            out.print("<pre>");
            out.println("DataSource class = " + ds);
            long start = System.currentTimeMillis();
	    Connection conn = null;

	    for (int i = 0; i < 10000000; i++) {
	        try {
		    conn = ds.getConnection();
	        } catch (SQLException e) {
		    e.printStackTrace(out);
	        } finally {
		    if (conn != null) { 
		        try {
			    conn.close();
		        } catch (SQLException se) {
			    se.printStackTrace(out);
		        }
		    }
	        }
	    }
	    long stop = System.currentTimeMillis();
            out.println("loop time is " + (stop - start) + "ms");
            out.print("</pre>");
        }
	    
        out.print("</body>");
        out.println("</html>");
    }
}
        

以下実行結果です。ちゃんと取得できています。

get DataSource success!! name = java:comp/env/jdbc/testDS

DataSource class = jp.livewell.baby.pool.jdbc.ConnectionPool@6f0be8
loop time is 8797ms
        

前へ 上へ 次へ