概要
JDBCを利用してデータベース関連の処理をする際に、これまではDriverManager を利用してコネクションを取得していたが、一般的には、DataSource と JNDI という仕組みを使ってコネクションを取得する方が良いということを知った。
DataSource を用いれば、リソース情報を外部ファイルに記述することができるほか、コネクションプーリングの機能も使える。
このDataSourceの実装クラスは複数あるが、Tomcatに含まれるデフォルトの実装クラスが何か知りたかったので、プログラムを書いて実験してみたところ、ところ、Tomcatバージョン8、9、10においてはorg.apache.tomcat.dbcp.dbcp2.BasicDataSource
がデフォルトで用いられることが分かった。
DataSourceのデフォルトの実装クラスは?
Tomcat には、Tomcat DBCP Pool という Tomcat に特化した実装がある。Apache common DBCP よりもパフォーマンスが優れているとされている。
実装の切り替えには、DataSouce の設定時に、factory 属性を記述してファクトリクラスを切り替えるだけで良い。
factory 属性を記述しない場合は、デフォルトの実装クラスが用いられるとのこと。
Tomcatのバージョンによってデフォルトの実装クラスが違うようで、ChatGPTに聞いてみたが、結果が判然としなかった。
そこで、実際にプログラムを書いて実験してみた。
実験
環境
- eclipse(pleiades all in one) 2022
- 上記に含まれるTomcat。すなわちTomcat8、9、10
プログラム
試験のためのプログラムは次のとおり。
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.InitialContext"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
final String RESOURCENAME = "jdbc/mydb";
try {
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/" + RESOURCENAME);
out.print(ds);
} catch (Exception e) {
// TODO: handle exception
out.print(e);
}
%>
</body>
</html>
これを、Tomcatのバージョンごとのサーバ上でそれぞれ動かした。
結果
Tomcat8、9、10 すべて
org.apache.tomcat.dbcp.dbcp2.BasicDataSource
であった。