コネクションプールについて
コネクションプール有とコネクションプール無でDB接続・切断を繰り返したときに
どれくらい差があるか試してみようと思いWebアプリ上(フレームワークにStruts2を使用)で
下記コードを実行してみました。
dbcpConnectメソッド(コネクションプール有) と jdbcConnectメソッド(コネクションプール無)
をそれぞれ千回づつループで回して実行してみました。
結果は
【コネクションプール有】実行にかかった時間:157384 ミリ秒
【コネクションプール無】実行にかかった時間:158760 ミリ秒
で大差はありませんでした。
コネクションプールを使用するともう少し早いと思っていたのですがそのようなことはないのでしょうか。
public String test4() {
// コネクションプール有の接続
long start = System.currentTimeMillis();
for(int i=0; i< 1000; i++)
{
dbcpConnect();
}
long stop = System.currentTimeMillis();
System.out.println("実行にかかった時間は " + (stop - start) + " ミリ秒です。");
// コネクションプール無の接続
start = System.currentTimeMillis();
for(int i=0; i< 1000; i++)
{
jdbcConnect();
}
stop = System.currentTimeMillis();
System.out.println("実行にかかった時間は " + (stop - start) + " ミリ秒です。");
return "jstl4";
}
public void dbcpConnect() {
Connection con = null;
try{
Context context = new InitialContext();
//DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/library");
DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/dhcpTest");
con = ds.getConnection();
Statement stmt = con.createStatement();
String sql = "SELECT * FROM test.test";
ResultSet rs = stmt.executeQuery(sql);
} catch(Exception e) {
System.out.println("Error");
} finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void jdbcConnect() {
Connection con = null;
try{
con = DriverManager.getConnection("jdbc:mysql://localhost", "root", "root");
Statement stmt = con.createStatement();
String sql = "SELECT * FROM test.test";
ResultSet rs = stmt.executeQuery(sql);
} catch(Exception e) {
System.out.println("Error");
} finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
補足
回答ありがとうございます。 紹介いただいたページは、コネクションプーリングについて分かりやすく解説してあり、大変参考になります。 今回の質問は、参考ページの図9の物理接続の状態を知るためには、DBサーバー側でV$SESSIONを確認するのが正しいのか、という内容です。 また、質問には記述していませんが、あわよくば図20の振る舞いも確認できるかも、と期待しています。 コネクションプーリングが有効であれば、SQL文を発行する度に物理接続の接続/切断を繰り返すはずはありません。 Web画面を動かしたところ、V$SESSIONの情報が質問に記述した状態になったため、コネクションプーリングが有効になっていないかも? と疑念を持ち、質問した次第です。