Я использую 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()
должен просто вернуть его в пул.
Кто-нибудь еще видел это, или я что-то здесь упускаю?
Спасибо.