DataSouceオブジェクトというのはJNDIでコンテキストファイルからDBの接続情報を参照してきてその情報をセットするものでこんな感じで私は使っている。
try { InitialContext ictx = new InitialContext(); DataSource ds = (DataSource) ictx.lookup("java:comp/env/jdbc/connect-db"); con = ds.getConnection(); } catch (Exception e) { throw new Exception(CLASS_NAME + "/getDBConnection() failure:" + e.getMessage()); }
このlookupしてきた情報はDataSourceオブジェクトの型で取得することになるが、これをDBCPのBasicDataSourceオブジェクト型で取得するには、コンテキストファイルのResourceの情報にfactoryの属性を追加するとできるようになる。
<Context path="/my-proj" reloadable="true" docBase="C:\eclipse\workspace\my-proj" workDir="C:\eclipse\workspace\my-proj\work"> <Resource name="jdbc/connect-db" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://my-address:3306/db?autoReconnect=true" username="user" password="pass" validationQuery="select 1" maxActive="100" factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxIdle="100" /> </Context>
上の記述のfactoryのところがポイント。で、下記のような感じでキャストしてBasicDataSourceオブジェクトとして使えるようになる。
public static Connection testConnection() throws Exception { Connection con = null; try { InitialContext ictx = new InitialContext(); BasicDataSource bds = (BasicDataSource) ictx.lookup("java:comp/env/jdbc/connect-db"); con = bds.getConnection(); // } catch (Exception e) { throw new Exception(CLASS_NAME + "/getDBConnection() failure:" + e.getMessage()); } return con; }
コンテキストファイルからJNDIで接続情報を取得してきてBasicDataSourceオブジェクトとして使えるのならコードに接続情報直書きよりかは便利かなと。Common DBCPを使ってみたかったのもあってコネクションのプールとか性能が今までより(?)上がってるといいのだけれど。
この実行テスト環境はJAVA 1.6、tomcat5.5、common-DBCP 1.4 といった感じ。