Как предотвратить аннулирование ResultSet при закрытии соединения?

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

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

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

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


person Ivan    schedule 24.10.2010    source источник


Ответы (4)


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

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

person Bozho    schedule 24.10.2010
comment
Согласитесь, вы можете использовать commons.apache.org/beanutils /api/org/apache/commons/beanutils/, чтобы избежать слоя шаблонного кода (описание вашего случая есть во вводной документации). - person bobah; 25.10.2010
comment
Слово предупреждения... Apache commons действительно не подходят для идиоматического Scala! - person Kevin Wright; 25.10.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)
person Kevin Wright    schedule 24.10.2010

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

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

person Brad Mace    schedule 24.10.2010