JDBC Resultset vs Rowset какой выбрать и когда? - PullRequest
17 голосов
/ 06 июля 2011

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

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

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

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

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

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

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

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

Ответы [ 2 ]

24 голосов
/ 15 июня 2013

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

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

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

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

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

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

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

9 голосов
/ 06 июля 2011

RowSet

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

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

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

Если вы просто передаете результаты запроса, JDBC определенные классы должны быть частьюваш публичный контракт.

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

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

Существует множество современных подходов к классу ResultSetMapper<T> для обработки генерирующих типизированных безопасных экземпляров домена с использованием шаблона Visitor, потому что это идиоматический способделать вещи.

...