1

JMetricを使用してDBCPプールをテストしています。20スレッドで1つのテストを使用すると、1つの接続からステートメントを作成しようとするとnullPointerExceptionが発生します。

私のコンテキストにはこのconfがあります:

<Context path="/MyApp" docBase="mypath..." crossContext="true" debug="1" reloadable="true" privileged="true" >
        <Resource name="jdbc/orcl"
           auth="Container"
           type="oracle.jdbc.pool.OracleDataSource"
           driverClassName="oracle.jdbc.driver.OracleDriver"
           factory="oracle.jdbc.pool.OracleDataSourceFactory"
           url="jdbc:oracle:thin:@192.168.1.11:1521:orcl"
           user="....."
           password="....."
           implicitCachingEnabled="true"
           connectionCachingEnabled="true"
           connectionCacheProperties="{InitialLimit=20, MinLimit=50, MaxLimit=350, MaxStatementsLimit=0, ConnectionWaitTimeout=10}"
           connectionCacheName="cacheOrcl"
           validationQuery="select 1 from dual"
           removeAbandoned="true"
           maxIdle="350"
           removeAbandonedTimeout="45"
           logAbandoned="true"  
            />

    </Context>

接続を取得していくつかの選択を実行するフィルターが1つあります。ロジックを再利用して接続を取得するために、1つの静的メソッドを作成します。

public static synchronized Connection getConnection() throws ConnectionException {

    Connection con = null;
    try {
        Object o = new InitialContext().lookup("java:comp/env/jdbc/orcl");
        if( o instanceof DataSource ) {
            DataSource ds = (DataSource) o;
            con = ds.getConnection();
            LOGGER.debug("conn:" + con);
        }
    }catch( Exception e ) {
        LOGGER.error(LogError.logError(e));
    }

    if( con == null ) {
        throw new ConnectionException("Conn null");
    }

    return con;
}

そして私のフィルター:

try {
        if( session.getAttribute(PARAM) == null ) {
            conexao = ConnectionUtil.getConnection();
            //call DAOS... (ommited)
        }
    }catch( Exception e ) {
        LOGGER.error( LogError.logError(e) );
    } finally {
        try{ 
            conexao.close();
            conexao = null;
        }catch( Exception e ){}
    }

NullPointerExceptionを受け取るために、DataSourceからのgetConnection()がまだ使用中の1つの接続を取得していると思います。

プールから接続を取得するための静的同期メソッドが1つある問題はありますか?

NullPointerException:

Statement st = conexao.createStatement();

編集:私は今tomcat-jdbcを試しています。彼は開いた接続をより適切に処理しているようですが、同時ユーザーでは失敗します(同じNullPointerExceptionまたは場合によってはjava.sql.SQLException:接続はすでに閉じられています)。

4

1 に答える 1

0

いくつかの戦いの後、SpringController内にConnectionタイプのプライベート属性が1つあることがわかりました。この属性にコメントを付け、メソッド内で接続を宣言しました。これで問題が解決しました。

于 2011-09-15T14:33:35.727 に答える