Java Oracle пул соединений - исключение закрытого соединения - PullRequest
0 голосов
/ 30 июня 2010

Этот пост предназначен не столько для вопроса, сколько для подтверждения того, что я все делаю правильно.Я видел много похожих сообщений, но не уверен, что полностью понимаю все, что было сказано.

Проблема в том, что по истечении определенного времени я получаю исключение при попытке установить соединение смоя база данных оракула.(Я использую Tomcat 6.0 и Spring)

Ранее у меня была следующая конфигурация:

private PoolDataSource poolDataSource = null;

public MainDAOImpl(String url, String username, String password)
        throws Exception
{
    poolDataSource = PoolDataSourceFactory.getPoolDataSource();

    try
    {
        poolDataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
        poolDataSource.setURL(url);
        poolDataSource.setUser(username);
        poolDataSource.setPassword(password);
    }
    catch( SQLException e )
    {
        ...
    }
}

public List<Object> getValues(String query)
{
    Connection connection = null;
    PreparedStatement preparedStatement = null;

    try
    {
        connection = poolDataSource.getConnection();
        preparedStatement = connection.prepareStatement(query);

        ...
    }
    catch( SQLException e )
    {
        ...
    }
    finally
    {
        //close connections
    }
}

Однако иногда preparedStatement = connection.prepareStatement(query); вызывал SQLException с сообщением «Закрытое исключение».

Важно отметить, что конструктор MainDAOImpl вызывается только один раз при перезапуске сервера (его зависимость вводится через Spring).

Недавно я изменил свою настройку так:*

и poolDataSource.getConnection() до dataSource.getConnection().

Я также добавил следующий ресурс в свой контекст в Tomcat:

<Resource name="jdbc/myOracleConn" auth="Container"
          type="javax.sql.DataSource"
          driverClassName="oracle.jdbc.OracleDriver"
          url="<myURL>"
          username="<myUsername>" password="<myPassword>"
          maxActive="20" maxIdle="10" maxWaith="-1" />

Это в основном следует http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html слово в слово.

Кажется, все работает.У меня вопрос, решат ли эти изменения мою проблему с закрытым соединением или мне нужно что-то другое?

Спасибо,

BJ

1 Ответ

1 голос
/ 30 июня 2010

Прежде всего, если вы используете Spring для внедрения зависимостей, я бы порекомендовал вам также использовать DI для внедрения в него зависимостей DAO.

Другими словами, в вашем DAO должен быть вставлен DataSource вэто, а не реализация DAO, зная, 1) какой тип источника данных построить или 2) как и где его искать в JNDI.Spring может обрабатывать JNDI-запросы для вас.

Я бы также рекомендовал использовать Spring * JdbcTemplate , так как он отлично подходит для обработки необработанных вызовов JDBC самостоятельно.*

Наконец, фактическое исключение, которое вы получаете, может быть просто из-за того, что сервер базы данных закрывает длинные открытые соединения.Не уверен, какую реализацию пула соединений вы используете, но в commons-dbcp есть опция для «validationQuery» , которую пул выполнит перед возвратом соединения, чтобы убедиться, что соединение все еще допустимо.Я уверен, что большинство других пулов предоставляют аналогичные функции, которые я бы порекомендовал здесь - таким образом, ваш DAO никогда не получает устаревшие соединения из пула.

...