JEP draft: Deprecate the RowSet API for Removal
Пометка RowSet API как Deprecated for Removal (устаревший, будет удалён)
| Ответственный | Lance Andersen |
| Тип | Feature |
| Область | SE |
| Статус | Draft |
| Компонент | core-libs / javax.sql |
| Обсуждение | core dash libs dash dev at openjdk dot java dot net |
| Трудоёмкость | XS |
| Длительность | XS |
| Создан | 2026/04/15 15:40 |
| Обновлён | 2026/05/14 14:54 |
| Задача | 8382268 |
Аннотация
Пометить RowSet API как Deprecated for Removal для удаления в будущем.
Мотивация
Платформа Java предоставляет JDBC для доступа к данным, хранящимся в базах данных, и для их обработки.
К основным интерфейсам JDBC относятся java.sql.Connection, java.sql.Statement и java.sql.ResultSet. Эти интерфейсы широко используются приложениями и фреймворками.
JDBC также определяет интерфейс javax.sql.RowSet, который предоставляет более высокоуровневую абстракцию над ResultSet в стиле JavaBeans. По сути, RowSet — это прокручиваемый, сериализуемый и, при необходимости, отключённый от базы данных контейнер табличных данных, предназначенный для GUI-приложений, распределённых систем и компонентных фреймворков.
Интерфейс RowSet дополняется несколькими связанными интерфейсами в пакете javax.sql, а также интерфейсами и базовыми классами в пакете javax.sql.rowset для реализаций RowSet. В этом JEP все эти типы вместе называются RowSet API.
RowSet API был спроектирован для моделей программирования веб-уровня и компонентно-ориентированных моделей, распространённых в конце 1990-х и начале 2000-х годов. Он так и не получил широкого распространения ни среди реализаций, ни среди пользователей.
Объекты RowSet используются мало
Объекты RowSet были спроектированы для архитектур приложений, в которых табличные данные обычно передавались напрямую между уровнями и компонентами. Настольные клиенты на Java, приложения Java Server Pages (JSP), приложения на основе Enterprise Java Beans (EJB) и инструменты в стиле JavaBeans обычно работали с табличными данными напрямую.
Типы RowSet предоставляли контейнеры, похожие на ResultSet, которые можно было отключить от базы данных и сериализовать. Они также поддерживали такие возможности, как слушатели, фильтрация, соединения (join) и синхронизация изменений обратно с источником данных. Отключённый контейнер, например CachedRowSet, должен был позволить приложениям:
- получать данные, пока доступно JDBC-соединение,
- быстро освобождать соединение,
- передавать данные другому уровню или компоненту,
- работать с данными, не удерживая ресурсы базы данных, и
- при необходимости позже записывать изменения обратно.
Такой дизайн соответствовал моделям программирования веб-уровня и компонентно-ориентированным моделям, распространённым в конце 1990-х и начале 2000-х годов. Он также отражал ожидания, что библиотеки тегов JSP и визуальные инструменты построения интерфейсов будут активно использовать табличные компоненты в стиле JavaBeans.
На практике Java-приложения эту модель программирования широко не использовали.
Современные приложения обычно используют другие подходы
Архитектурные допущения, на которых основаны объекты RowSet, больше не распространены. Современные Java-приложения обычно используют:
- фреймворки объектно-реляционного отображения, в том числе Jakarta Persistence и Hibernate,
- типобезопасные SQL-библиотеки, например jOOQ,
- фреймворки доступа к данным, в том числе Spring JDBC и MyBatis,
- сервис-ориентированные архитектуры, которые обмениваются JSON, Protocol Buffers (protobuf) или предметно-ориентированными Data Transfer Objects (DTO), а не экземплярами
RowSet, или - API для нереляционных данных, например MongoDB Java Driver, где JDBC не является подходящей абстракцией.
Приложения, которым нужны отключённые от базы данные, постраничная выборка, привязка данных или оптимистичные обновления, обычно используют эти подходы вместо RowSet API.
Поддержка в экосистеме и использование сократились
Судя по всему, почти нет свидетельств того, что новые приложения разрабатываются с использованием RowSet API, и сравнительно мало свидетельств его заметного продолжающегося использования в существующих приложениях.
Неформальные исследования кодовых баз с открытым исходным кодом выявляют сравнительно мало активных использований, если не считать очень старых примеров, кода для совместимости и устаревшей документации. Публичные обсуждения и активность в экосистеме, связанные с этим API, по-видимому, ограничены. Например, на Stack Overflow сравнительно мало вопросов об объектах RowSet, учитывая возраст этой возможности, и, судя по всему, сообщество почти не продолжает обсуждать этот API.
Интерфейс RowSet был добавлен в Java 1.4, а пакет javax.sql.rowset — в Java 5.0. С тех пор JDK получил очень мало сообщений об ошибках и запросов на улучшение, связанных с RowSet API. По-видимому, интереса к дальнейшему развитию этого API почти нет.
Помимо реализации, входящей в JDK, для спецификации RowSet было создано сравнительно немного сторонних реализаций и интеграций, и большинство из них с тех пор объявлены устаревшими или удалены:
-
Oracle RowSets был объявлен устаревшим в Oracle Database 12c Release 2 (12.2) в 2017 году
-
Реализация WebLogic RowSets была объявлена устаревшей в WebLogic Server 12.1.2 в 2013 году
-
NetBeans Visual Web Pack, включавший инструменты для работы с RowSet, был удалён в NetBeans 6.8 в 2009 году
Такое сокращение поддержки со стороны поставщиков согласуется с ограниченным распространением RowSet API и небольшой активностью вокруг него в экосистеме.
Сохранение объектов RowSet влечёт постоянные затраты
Даже редко используемый модуль влечёт постоянные затраты. Для платформы Java это затраты на спецификацию, реализацию, тестирование, поддержание совместимости и документацию, и всё это требует постоянного сопровождения. Кроме того, JDK содержит набор тестов для RowSet, хотя без интеграции с внешней базой данных можно проверить только часть API.
Кроме того, затраты несут поставщики, предоставляющие реализации JDBC API. Даже если они не предоставляют реализацию RowSet, объекты RowSet остаются частью спецификаций JDBC, и их всё равно необходимо учитывать при текущей работе над дизайном, реализацией и совместимостью.
Удаление объектов RowSet, вероятно, мало повлияет на большинство Java-разработчиков и при этом сократит долгосрочные обязательства по сопровождению в экосистеме Java. Поэтому пометка RowSet API как Deprecated for Removal для удаления в будущем должна иметь небольшие последствия.
Итак, интерес к использованию RowSet API в новых Java-приложениях, по-видимому, невелик. Этот API отражает модели программирования и архитектурные допущения, которые больше не распространены в современной разработке приложений на Java.
Описание
В JDK xx мы:
-
Пометим как Deprecated for Removal следующие интерфейсы в пакете
javax.sql:javax.sql.RowSetjavax.sql.RowSetEventjavax.sql.RowSetInternaljavax.sql.RowSetMetaDatajavax.sql.RowSetReaderjavax.sql.RowSetWriter
-
Пометим как Deprecated for Removal все интерфейсы и классы в пакетах
javax.sql.rowset,javax.sql.rowset.serialиjavax.sql.rowset.spi. -
Добавим уведомления об устаревании в объявления пакетов и в объявление содержащего их модуля
java.sql.rowset.
Альтернативы
Оставить RowSet API без изменений
Одна из альтернатив — оставить RowSet API как есть, как это было на протяжении многих лет. Это по-прежнему создавало бы постоянный риск для качества и нагрузку по сопровождению. Эти постоянные затраты не оправданы той минимальной пользой, которую этот практически неиспользуемый механизм сейчас приносит платформе.
Перенести RowSet API в отдельный проект
Другая возможность — перенести RowSet API в отдельный проект. Скорее всего, для этого пришлось бы передать спецификации, исходный код и тесты RowSet API какому-либо фонду, например Eclipse или Apache, как это уже делалось для JDO и Java EE (Jakarta EE). После этого API был бы удалён из платформы Java. На сегодняшний день нам неизвестно ни о ком, кто был бы заинтересован взяться за такой проект.
Риски и допущения
Возможно, некоторые продукты используют классы RowSet из пакета javax.sql.rowset, и поэтому удаление этих классов на них повлияет. Однако, учитывая ограниченную активность в экосистеме и небольшое число сообщений об ошибках и запросов на улучшение, связанных с RowSet, маловероятно, что эти классы широко используются в современных приложениях.
Также возможно, что некоторые проекты используют CachedRowSet в тестовых сценариях для создания mock-объекта ResultSet. Проектам, которые полагаются на этот подход, может потребоваться перейти на альтернативы, например разработать собственные mock-объекты или встроить реализацию CachedRowSet в свою тестовую инфраструктуру.
Приложения, зависящие от RowSet API, могут продолжать использовать существующие поддерживаемые выпуски JDK, пока переходят с этого API на другие решения.