Tomcat 5.5を使用するBlackboardラーニングソフトウェアで実行しているJava Webアプリケーションがあります。 アプリは外部データベースに接続します。シングルトンクラスを使用したJava Webアプリケーションでのプールデータソースの管理、Tomcat、C3P0
私はBlackboardサーバー上でデータソースを宣言するためのアクセス権がありません。そのため、Webアプリケーションのすべてをパッケージ化しようとしています。私は、使用後にすべての結果セット、ステートメント、接続を注意深く閉じているにも関わらず、コモンズベースのプーリング・アプローチで接続が不足しているという問題がありました。 私は現在、C3P0プーリング方式に切り替える予定ですが、一般的なアプローチが正しいかどうかはわかりません。
私は、接続プーリングを実装するデータソースの作成と破壊を最小限に抑える目的で、シングルトンクラスを使用してデータソースを作成しています。以下のクラスでは、これを明確に説明する必要があります。これは合理的なアプローチですか、それとも接続がなくなったという私の以前の問題に寄与している可能性がありますか?
ありがとうございました。
EDIT。シングルトンアプローチの目的を明確にする質問を更新しました。私は、DB接続が必要なたびにデータソースを作成しないようにしようとしています。これは、接続プーリングの利点を無効にするようです。
DataSourceクラス:
import java.beans.PropertyVetoException;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import com.mchange.v2.c3p0.*;
public class MyDataSource {
private static MyDataSource mds = new MyDataSource();
public static DataSource ds;
private MyDataSource() {
try {
ds = getDataSource();
} catch (NamingException e) {
e.printStackTrace();
}
}
public static MyDataSource getInstance(){
return mds;
}
public Connection getConnection() throws SQLException, NamingException {
Connection myConnect = ds.getConnection();
return myConnect;
}
private DataSource getDataSource() throws NamingException {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass("com.mysql.jdbc.Driver");
} catch (PropertyVetoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cpds.setJdbcUrl("jdbc:mysql://195.195.xx.xx:3306/dbName");
cpds.setUser("lemmy");
cpds.setPassword("xxx");
cpds.setMaxIdleTime(180);
cpds.setMaxPoolSize(100);
return cpds;
}
}
Connectionクラス:
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class DbConnection {
public Connection c;
public DbConnection() throws NamingException, SQLException {
c = getConnection();
}
public Connection getConnection() throws SQLException, NamingException {
Connection myConnect = MyDataSource.getInstance().getConnection();
return myConnect;
}
public void close(){
JDBCUtils.close(this.c);
}
}
クロージング接続等
import java.sql.*;
public class JDBCUtils {
static public void close (ResultSet rs) {
try { if (rs!=null) rs.close(); } catch (Exception e) {}
}
// Works for PreparedStatement also since it extends Statement.
static public void close (Statement stmt) {
try { if (stmt!=null) stmt.close(); } catch (Exception e) {}
}
static public void close (java.sql.Connection conn) {
try { if (conn!=null) conn.close(); } catch (Exception e) {}
}
}
使用例:
String myQuery = null;
DbConnection myConnect = null;
Statement myStatement = null;
ResultSet rs = null;
try {
myConnect = new DbConnection();
myStatement = myConnect.c.createStatement();
// Do stuff here
}catch (SQLException e) {
out.println("SQL Error: "+e);
} finally {
JDBCUtils.close(rs);
JDBCUtils.close(myStatement);
myConnect.close();
}
シングルトンとは、1つのデータソースを意味します。しかし、データソースは複数の接続を提供します。それとも間違っているのですか? – Lemmy
シングルトンのポイントが表示されません。 – duffymo
アイデアは、db接続が必要なたびに新しいデータソースがインスタンス化されるのを防ぎ、1つのデータソースが接続プールとともに使用されていることを確認することです。 – Lemmy