Пул DBCP использует то же соединение?

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

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

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

Statement st = conexao.createStatement();

EDIT: сейчас я пробую tomcat-jdbc. Кажется, он лучше обрабатывает открытые соединения, но все еще не работает с одновременными пользователями (то же исключение NullPointerException или иногда java.sql.SQLException: соединение уже закрыто).


person Community    schedule 14.09.2011    source источник
comment
На Psi-Probe (code.google.com/p/psi-probe) Я вижу, что соединения по-прежнему заняты даже после того, как я истечет срок действия всех сеансов.   -  person    schedule 14.09.2011
comment
Где трассировка стека для NPE? Вы уверены, что NPE НЕ выходит из вашего блока finally? Что делать, если conexao равен нулю? НПЭ...   -  person MarkOfHall    schedule 15.09.2011


Ответы (1)


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

person Community    schedule 15.09.2011