ResultSet Объект закрыт - jtds - PullRequest
0 голосов
/ 10 ноября 2011

Я использую JTDS для подключения к MS-SQL 2005. Я использую c3p0 в качестве пула соединений с БД, настроенного с помощью Spring.

Я случайно получаю SQLException: Invalid state, the ResultSet object is closed в скрипте Groovy вкоторый я передал ссылку на пул соединений.Сценарий выполняется таймером очень часто.Под случайностью я подразумеваю, что сценарий работает идеально в 99% случаев, но когда он не работает, он делает это пару раз, а затем снова возвращается к правильной работе, выбирая, где он остановился.Вся критическая работа выполняется в транзакции, выполняющей очередь сообщений.

Логика ниже:

    //passed into the groovy context
    DataSource source = source;
    Connection conn = source.getConnection();

    ...
    //Have to omit proprietary DB stuff... sorry...
    PreparedStatement fooStatement = conn.prepareStatement("INSERT INTO foo (x,y,z) VALUES (?,?,?) select SCOPE_IDENTITY();");        
    ResultSet identRes = fooStatement.executeQuery();

    //This is where the execption is thrown.
    identRes.next();

    ...

    try{
         log.info("Returning SQL connection.");
         conn.close();
    }catch(Exception ex){}

Существует отдельный поток таймера, который выполняет аналогичный скрипт groovy, вкоторого мы не видели в этом выпуске.Этот скрипт использует аналогичные вызовы, чтобы получить соединение и закрыть его.

Первоначально мы думали, что второй сценарий мог захватывать одно и то же соединение из пула, сначала заканчивая, а затем закрывая соединение.Но документация c3p0 гласит, что вызов conn.close() должен просто вернуть его в пул.

Кто-нибудь еще видел это, или я что-то здесь упускаю?

Спасибо.

1 Ответ

2 голосов
/ 15 ноября 2011

Мы решили это ... C3P0 был настроен на сброс соединений, которые были проверены более чем на 30 секунд, мы сделали это, чтобы предотвратить тупик в базе данных (мы не контролируем настройку). Одна из транзакций выполнялась ужасно долго, и C3P0 сбрасывал соединение, что приводило к закрытой ошибке ResultSet. Удивительно, однако, что C3P0 не регистрировал инцидент, поэтому мы не увидели этого в журналах приложения.

...