首页 文章

DBCP池使用相同的连接?

提问于
浏览
1

我正在使用JMetric来测试我的DBCP池 . 使用一个带有20个线程的测试,当我尝试从一个Connection创建statement时,我收到nullPointerException .

我的背景是这样的:

<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>

我有一个过滤器,可以获得连接并执行一些选择 . 要重用逻辑来获取连接,我创建了一个静态方法:

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()正在撤销仍在使用的一个连接 .

问题有一个静态同步方法来从池中获取连接吗?

NullPointerException:

Statement st = conexao.createStatement();

EDIT: 我正在尝试tomcat-jdbc . 他似乎更好地处理打开的连接,但仍然在并发用户中失败(相同的NullPointerException或有时java.sql.SQLException:Connection已经关闭 . )

1 回答

  • 0

    经过一番战斗后,我发现我的Spring Controller中有一个类型为Connection的私有属性 . 我评论了这个属性并在我的方法中声明了连接,这解决了我的问题 .

相关问题