DBCP Pool, используя то же соединение? - PullRequest
1 голос
/ 14 сентября 2011

Я использую JMetric для проверки своего пула DBCP.Используя один тест с 20 потоками, я получаю исключение nullPointerException, когда я пытаюсь создатьStatement из одного соединения.

Мой контекст имеет такой конф:

<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, я думаю, что getConnection () из DataSourceвосстановление одного соединения, которое все еще используется.

Есть ли проблема с одним статическим синхронизированным методом для получения соединения из пула?

Исключение NullPointerException:

Statement st = conexao.createStatement();

РЕДАКТИРОВАТЬ: Я сейчас пытаюсь tomcat-JDBC.Кажется, он лучше обрабатывает открытые соединения, но все еще не работает у одновременных пользователей (то же самое NullPointerException или иногда java.sql.SQLException: соединение уже было закрыто.)

1 Ответ

0 голосов
/ 15 сентября 2011

После некоторого боя я увидел, что у меня есть один закрытый атрибут типа Connection внутри моего Spring Controller.Я прокомментировал этот атрибут и объявил соединение внутри моего метода, и это решило мою проблему.

...