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

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

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

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

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

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

  • но это даже дело запросы на чтение и запись?? Вы можете синхронизировать ResultSet обратно в БД? (Я не конечно, если это возможно (это может быть и я просто не могу вспомнить или Google это достаточно хорошо :) прошло некоторое время с raw JDBC...

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

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

2 ответов


строк

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

ResultSet никогда не должно быть частью общественности заключить.

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

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

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

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

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


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

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

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

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

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

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

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