2012-02-16 5 views
0

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(); 
    } 

答えて

0

これはすべての点で間違った考えだと思います。

接続プールに複数の接続が必要です。プールがライフサイクルを管理できるようにします。すべての要求に対して作成コストを償却します。

シングルトンは、1つ1つのリクエストを意味します。それは私には意味がありません。

アプリはこのように接続を使用する必要があります(リクエストごとに1つ)。取得し、使用し、単一の方法の範囲でプールに戻します。そのようにスケールアップされます。あなたが書き込むコードも少なくて済みます。 JNDIデータリソースとして設定してください。

+1

シングルトンとは、1つのデータソースを意味します。しかし、データソースは複数の接続を提供します。それとも間違っているのですか? – Lemmy

+0

シングルトンのポイントが表示されません。 – duffymo

+0

アイデアは、db接続が必要なたびに新しいデータソースがインスタンス化されるのを防ぎ、1つのデータソースが接続プールとともに使用されていることを確認することです。 – Lemmy

1

JdbcTemplateを春のフレームワークから見るとよいでしょう。 Springは多くのヘルパークラスを提供すると主張しているので、スタンドアロンで使用することができます。これにより、接続/ステートメント/結果セットネストの問題が簡素化されます。また、クエリ処理も簡単です。

私は学習目的のためにおそらくJdbcTemplateを使用しないことがわかっていますが、クラスの設計は面白いです。

プールでは、すでに@duffymoから回答があります。

+0

ありがとう、私はそれを見ていきます。既存のアプローチで間違っているかどうかはまだ分かりません。私が見つけることができるすべての例は、Webサーバー上に設定されたデータソースを使用します。 – Lemmy

+0

私は静的なデータソースを使った同様のアプローチであるこの例を見つけました:http://stackoverflow.com/questions/1458693/jdbc-connection-pooling-using-c3p0 – Lemmy

+0

あなたが確認を探しているなら、あなたは何ですか?ここに? – duffymo

関連する問題