JDBC Resultset vs Rowset, который выбрать и когда?

Итак, я знаю некоторые относительные различия, то есть ResultSet имеет "открытое соединение" с базой данных, тогда как RowSet работает "отключен".

Но это в значительной степени то, что я понимаю (может быть неправильным:)

Мой вопрос заключается в следующем: при каких обстоятельствах предпочтительнее другого? Каковы их сильные/слабые стороны?

  • Из того, что я чувствую, RowSet, работающий в отключен, особенно для запросы "только для чтения", более высокая производительность параллельная система. Это верно? Если это так, то можно сказать, что RowSet всегда предпочтительнее ResultSet для запросов на чтение?

  • Если я правильно повторяю RowSet не выдает исключения SQL, но является ли это преимуществом? Другой что RowSet является сериализуемым. Но моя озабоченность связана прежде всего с с точки зрения эффективности выбор?

  • Но это даже имеет значение для запросы на чтение-запись? Можете ли вы синхронизировать ResultSet обратно в БД? (Я не если это возможно (может быть и я просто не могу вспомнить или google это достаточно хорошо:) Это было время с сырым JDBC...

Любые идеи? Есть некоторые недостающие пробелы в моих знаниях, как это видно:)

Причина, по которой я прошу, - это выбрать между интерфейсом Spring -Jdbc ResultSetExtractor и возвратом SqlRowSet при обработке некоторых данных. Этот вопрос мне просто любопытно, как решить, что выбрать, кроме как бросать монету:)

Ответ 1

RowSet

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

ResultSet никогда не должен быть частью открытого API.

Связанный ResultSet/Rowset никогда не должен выходить из метода или, в худшем случае, из объекта, который их создал. По крайней мере, с помощью RowSet вы можете отключить его, и клиент не должен заботиться о реализации.

В идеале вы хотите материализовать содержимое RowSet/ResultSet для типов безопасных объектов домена.

В большинстве случаев вы хотите материализовать объекты домена List/Set для управления и работы вместо того, чтобы напрямую связывать ваш код с JDBC api.

Ответ 2

Я не согласен с ответом JR. RowSet часто является хорошим выбором, но, как всегда, лучший ответ зависит от вашей ситуации и ваших потребностей. Использование RowSet для всего не приведет к дисфункциональному коду, но может предложить более медленную производительность, чем ResultSet (общая реализация JdbcRowSet является оберткой для ResultSet).

Если вам нужно использовать свой объект результата в модульном коде, который требует JavaBean, тогда RowSets отвечают минимальным требованиям для Java Beans.

Если вы разрабатываете код для многопоточного/серверного приложения, вы должны согласиться с концессией, что все Java Beans являются изменяемыми и, следовательно, не потокобезопасными. В результате ни Resultset, ни RowSets не являются потокобезопасными.

Если вы пишете код, который потребляет запросы к базе данных и переводит их в объекты модели данных Java для использования в остальной части вашего приложения, то вполне вероятно, что RowSets менее эффективны, чем Resultsets.

В большом количестве кода, который я писал, когда я получаю запрос базы данных JDBC, я просто использовал Набор результатов для обработки строк retrievd сразу в Список объектов модели данных. Набор результатов даже не выдерживает вызова метода, который выполняет перевод. На мой взгляд, это хорошо... потому что Resultsets (и поэтому RowSets) потребляют много ресурсов, и вы хотите, чтобы они были доступны для gc, как только сможете.

В этом режиме мне даже не нужны какие-либо из новых функций Resultset, не говоря уже о RowSet. Я просто перебираю вперед один раз через набор и генерирую список строк результатов.

Бывают ситуации, когда RowSets очень желательны. Так как RowSets являются сериализуемыми и якобы "легкими", отключенный CachedRowSet (например) представляет собой достаточно эффективный механизм для передачи результатов запроса базы данных между местоположениями, особенно если вы хотите, чтобы данные были обновляемыми на месте. Конечно, вы также можете сериализовать и передать список объектов.