2011年9月8日木曜日

JBoss+PostgreSQLでコネクションプーリング

JBossとPostgreSQLでコネクションプーリングしてみました。
Javaです。

まずは、JBossのほうに設定。deployディレクトリに設定ファイルであるpostgres-ds.xmlを入れます。
このdsファイルは、docファイルに各種データベース用のサンプルがあるので、例えばMySQLとつなぎたいとかOracleとつなぎたいという場合でも簡単にできます。

postgres-ds.xml

<datasources>
  <local-tx-datasource>
    <jndi-name>PostgresDS</jndi-name>
    <connection-url>jdbc:postgresql://localhost:5454/test</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>postgres</user-name>
    <password>postgres</password>
    <metadata>
         <type-mapping>PostgreSQL 7.2</type-mapping>
      </metadata>
  </local-tx-datasource>
</datasources>


ではではJavaで実装。
ちょっとクラス分けしてみました。
まずはコネクションを取得するためのクラス。

ConnectionManager.java

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnectionManager {
 /**
  * コネクションを取得するメソッド
  * @return Connection
  * @throws SQLException
  * @throws NamingException
  */
 public Connection getConnection() throws SQLException, NamingException {
  InitialContext icx = new InitialContext();
  //postgres-ds.xmlに書いたJNDI名を書く。
  //JBossを起動したときにコンソールに表示されるので、それを書くと尚確実。
  DataSource ds = (DataSource) icx.lookup("java:PostgresDS");
  Connection conn = ds.getConnection();
  return conn;
 }

}


こちらはちゃんと実行できるかどうかのテスト用Servlet。

ConnectionGetSample.java

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ConnectionGetSample extends HttpServlet {

 private static final long serialVersionUID = 1L;

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  // 準備
  ConnectionManager cm = new ConnectionManager();
  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;

  // SQL文(ここではテストでpostgresユーザーを出すSQLにしてみる)
  String sql = "select * from pg_user";

  try {
   // コネクション取得。
   // ConnectionManagerクラスでthrowしてるExceptionを
   // こっちでcatchする。
   conn = cm.getConnection();

   // SQL実行
   ps = conn.prepareStatement(sql);
   rs = ps.executeQuery();

   // 結果取得→出力
   while (rs.next()) {
    System.out.println(rs.getString(1));
   }

  } catch (SQLException e) {
   e.printStackTrace();
  } catch (NamingException e) {
   e.printStackTrace();
  } finally {
   // クローズ処理
   if (rs != null) {
    try {
     rs.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   if (ps != null) {
    try {
     ps.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   if (conn != null) {
    try {
     conn.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
  }

 }

}




で、できました。