Как предотвратить, чтобы ResultSet был признан недействительным при закрытии соединения? - PullRequest
2 голосов
/ 25 октября 2010

Я хотел бы передать набор результатов из функции, которая выполняет запрос и закрывает соединение.

Но ResultSet становится недействительным, как только его родительское соединение закрывается и выдает

java.sql.SQLException: Operation not allowed after ResultSet closed

Как этого избежать?

Ответы [ 4 ]

7 голосов
/ 25 октября 2010

Вы не можете.Если вы хотите получить все данные, выполните цикл ResultSet и вставьте данные в свою коллекцию.

Взгляните на commons-dbutils - в нем много полезногохелперы.

6 голосов
/ 25 октября 2010

Также рассмотрите возможность использования отключенного набора результатов: CachedRowSet.Быстрый поиск в Google дал мне следующее: Использование CachedRowSet для передачи результатов запросов JDBC между классами .

5 голосов
/ 25 октября 2010

Вы хотите вывернуть свое мышление наизнанку!

Создайте функцию, которая будет что-то делать с ResultSet, и передать его как замыкание в функцию, выполняющую запрос.

def withQuery[T](query:String)(template: ResultSet => T) : T = {
  val resultSet = runQuery(query)
  val ret = template(resultSet)
  resultSet.close
  ret
}

val output = withQuery("select * from ...") {
  resultSet =>
  //some expression that generates a string from the resultset
}

println(output)
2 голосов
/ 25 октября 2010

Это не совсем так, как работает ResultSet. Он не хранит данные сам по себе, он просто действует как интерфейс к ним.

Вместо этого вы можете попробовать, чтобы класс, возвращающий ResultSet, содержал список тех, которые он выдал. Каждый фрагмент кода, который использует ResultSet, может вызывать close(), когда это будет сделано. Затем первый класс может проверить, все ли выданные ResultSet были закрыты (используя isClosed()), и, если это так, закрыть соединение.

...