Spec-Zone.ru › OpenJDK 24

Интерфейс CachedRowSet

Все суперинтерфейсы:
AutoCloseable, Joinable, ResultSet, RowSet, Wrapper
Все известные подинтерфейсы:
FilteredRowSet, JoinRowSet, WebRowSet
public interface CachedRowSet extends RowSet, Joinable
Интерфейс, который должны реализовывать все стандартные реализации CachedRowSet.

Реализация по умолчанию интерфейса CachedRowSet, предоставленная компанией Oracle Corporation, является стандартной реализацией. Разработчики могут использовать эту реализацию как есть, расширять её или выбрать написание собственных реализаций этого интерфейса.

Объект CachedRowSet — это контейнер для строк данных, который кеширует свои строки в памяти, что позволяет работать без постоянного подключения к источнику данных. Кроме того, это компонент JavaBeans, который является прокручиваемым, обновляемым и сериализуемым. Объект CachedRowSet обычно содержит строки из набора результатов, но он также может содержать строки из любого файла с табличной структурой, например, таблицы электронных таблиц. Реализация по умолчанию поддерживает получение данных только из объекта ResultSet, но разработчики могут расширить реализации SyncProvider для предоставления доступа к другим источникам табличных данных.

Приложение может изменять данные в объекте CachedRowSet, и эти изменения могут быть затем распространены обратно к источнику данных.

Объект CachedRowSet — это отключённый набор строк, что означает, что он использует подключение к источнику данных только кратковременно. Он подключается к источнику данных во время чтения данных, чтобы заполнить себя строками, и снова во время распространения изменений обратно в базовый источник данных. В остальное время объект CachedRowSet отключён, включая время изменения его данных. Отключение делает объект RowSet более компактным и, следовательно, более лёгким для передачи другому компоненту. Например, отключённый объект RowSet можно сериализовать и передать по сети на тонкий клиент, такой как персональный цифровой помощник (PDA).

1.0 Создание объекта CachedRowSet

Следующая строка кода использует конструктор по умолчанию для CachedRowSet, предоставленный в эталонной реализации (RI), для создания объекта CachedRowSet по умолчанию.
     CachedRowSetImpl crs = new CachedRowSetImpl();
 
Этот новый объект CachedRowSet будет иметь свои свойства, установленные на значения по умолчанию объекта BaseRowSet, и, кроме того, он будет иметь объект RIOptimisticProvider в качестве своего поставщика синхронизации. RIOptimisticProvider, одна из двух реализаций SyncProvider, включённых в RI, является поставщиком по умолчанию, который синглтон SyncFactory предоставит, если не указан поставщик синхронизации.

Объект SyncProvider предоставляет объекту CachedRowSet читатель (объект RowSetReader) для чтения данных из источника данных, чтобы заполнить себя данными. Читатель может быть реализован для чтения данных из объекта ResultSet или из файла с табличной структурой. Объект SyncProvider также предоставляет писатель (объект RowSetWriter) для синхронизации любых изменений в данных объекта CachedRowSet, внесённых во время отключения, с данными в базовом источнике данных.

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

Объект CachedRowSet может использовать любую реализацию SyncProvider, которая была зарегистрирована в синглтоне SyncFactory. Приложение может узнать, какие реализации SyncProvider были зарегистрированы, вызвав следующую строку кода.

      java.util.Enumeration providers = SyncFactory.getRegisteredProviders();
 

Существует два способа, которыми объект CachedRowSet может указать, какой объект SyncProvider он будет использовать.

  • Указание имени реализации в конструкторе
    Следующая строка кода создаёт объект CachedRowSet crs2, который инициализируется значениями по умолчанию, за исключением того, что его объект SyncProvider — это указанный объект.
              CachedRowSetImpl crs2 = new CachedRowSetImpl(
                                     "com.fred.providers.HighAvailabilityProvider");
         
  • Установка объекта SyncProvider с помощью метода CachedRowSet setSyncProvider
    Следующая строка кода сбрасывает объект SyncProvider для crs, объекта CachedRowSet, созданного с конструктором по умолчанию.
               crs.setSyncProvider("com.fred.providers.HighAvailabilityProvider");
          
См. комментарии к SyncFactory и SyncProvider для получения дополнительной информации.

2.0 Получение данных из объекта CachedRowSet

Данные извлекаются из объекта CachedRowSet с использованием методов-геттеров, унаследованных от интерфейса ResultSet. Следующие примеры, в которых crs является объектом CachedRowSet, демонстрируют, как перебирать строки, извлекая значения столбцов в каждой строке. В первом примере используется версия методов-геттеров, принимающая номер столбца; во втором примере используется версия, принимающая имя столбца. Номера столбцов обычно используются, когда команда объекта RowSet имеет вид SELECT * FROM TABLENAME; имена столбцов чаще всего используются, когда команда указывает столбцы по имени.
    while (crs.next()) {
        String name = crs.getString(1);
        int id = crs.getInt(2);
        Clob comment = crs.getClob(3);
        short dept = crs.getShort(4);
        System.out.println(name + "  " + id + "  " + comment + "  " + dept);
    }
 
    while (crs.next()) {
        String name = crs.getString("NAME");
        int id = crs.getInt("ID");
        Clob comment = crs.getClob("COM");
        short dept = crs.getShort("DEPT");
        System.out.println(name + "  " + id + "  " + comment + "  " + dept);
    }
 

2.1 Получение RowSetMetaData

Приложение может получить информацию о столбцах в объекте CachedRowSet, вызвав методы ResultSetMetaData и RowSetMetaData объекта RowSetMetaData. Следующий фрагмент кода, в котором crs — это объект CachedRowSet, иллюстрирует процесс. Первая строка создаёт объект RowSetMetaData с информацией о столбцах в crs. Метод getMetaData, унаследованный от интерфейса ResultSet, возвращает объект ResultSetMetaData, который приводится к типу объекта RowSetMetaData перед присваиванием переменной rsmd. Вторая строка определяет количество столбцов в jrs, а третья строка получает тип JDBC значений, хранящихся во втором столбце объекта jrs.
     RowSetMetaData rsmd = (RowSetMetaData)crs.getMetaData();
     int count = rsmd.getColumnCount();
     int type = rsmd.getColumnType(2);
 
Интерфейс RowSetMetaData отличается от интерфейса ResultSetMetaData двумя способами.
  • Он включает методы setter: Объект RowSet использует эти методы во внутреннем формате, когда он заполняется данными из другого объекта ResultSet.
  • Он содержит меньше методов getter: Некоторые методы ResultSetMetaData не применяются к объекту RowSet. Например, методы, получающие информацию о том, является ли значение столбца изменяемым или только для чтения, не применяются, потому что все столбцы объекта RowSet будут изменяемыми или только для чтения, в зависимости от того, обновляемый ли набор строк.
ПРИМЕЧАНИЕ: для возвращения объекта RowSetMetaData реализации должны переопределять метод getMetaData(), определённый в java.sql.ResultSet, и возвращать объект RowSetMetaData.

3.0 Обновление объекта CachedRowSet

Обновление объекта CachedRowSet аналогично обновлению объекта ResultSet, но поскольку набор строк не подключен к источнику данных во время обновления, он должен выполнить дополнительный шаг, чтобы отразить изменения в базовом источнике данных. После вызова метода updateRow или insertRow, объект CachedRowSet также должен вызвать метод acceptChanges, чтобы обновления были записаны в источник данных. Следующий пример, в котором курсор находится на строке в объекте CachedRowSet crs, показывает код, необходимый для обновления двух значений столбцов в текущей строке и обновления базового источника данных объекта RowSet.
     crs.updateShort(3, 58);
     crs.updateInt(4, 150000);
     crs.updateRow();
     crs.acceptChanges();
 

Следующий пример демонстрирует переход к строке вставки, создание новой строки в строке вставки, вставку её в набор строк и вызов метода acceptChanges для добавления новой строки в базовый источник данных. Обратите внимание, что, как и в случае с методами-геттерами, методы-апдейтеры могут принимать либо индекс столбца, либо имя столбца для обозначения обрабатываемого столбца.

     crs.moveToInsertRow();
     crs.updateString("Name", "Shakespeare");
     crs.updateInt("ID", 10098347);
     crs.updateShort("Age", 58);
     crs.updateInt("Sal", 150000);
     crs.insertRow();
     crs.moveToCurrentRow();
     crs.acceptChanges();
 

ПРИМЕЧАНИЕ: место, где метод insertRow() вставляет содержимое строки вставки объекта CachedRowSet, определяется реализацией. Реализация по умолчанию для интерфейса CachedRowSet вставляет новую строку непосредственно после текущей строки, но она может быть реализована для вставки новых строк в любом другом месте.

Ещё одна деталь, о которой стоит упомянуть в этих примерах, — это то, как они используют метод acceptChanges. Именно этот метод распространяет изменения в объекте CachedRowSet обратно в базовый источник данных, вызывая внутренний метод писателя объекта RowSet для записи изменений в источник данных. Для этого писателю приходится нести затраты на установление соединения с этим источником данных. Два предыдущих фрагмента кода вызывают метод acceptChanges сразу после вызова updateRow или insertRow. Однако при изменении нескольких строк более эффективно вызвать acceptChanges после всех вызовов updateRow и insertRow. Если acceptChanges вызывается только один раз, необходимо установить только одно соединение.

4.0 Обновление базового источника данных

При выполнении метода acceptChanges, писатель объекта CachedRowSet, объект RowSetWriterImpl, вызывается в фоновом режиме для записи изменений, внесённых в набор строк, в базовый источник данных. Писатель реализован таким образом, чтобы установить соединение с источником данных и записать обновления в него.

Писатель предоставляется через реализацию интерфейса SyncProvider, как обсуждалось в разделе 1 «Создание объекта CachedRowSet». Поставщик эталонной реализации по умолчанию RIOptimisticProvider реализует своего писателя, используя механизм оптимистического контроля параллельности. То есть, он не поддерживает блокировки в базе данных, пока набор строк отключён от базы данных, и просто проверяет наличие конфликтов перед записью данных в источник данных. Если конфликты имеются, ничего не записывается в источник данных.

Утилита чтения/записи, предоставляемая классом SyncProvider, является подключаемой, что позволяет настраивать получение и обновление данных. Если требуется другой механизм управления конкурентностью, можно подключить другую реализацию класса SyncProvider, используя метод setSyncProvider.

Для использования оптимистичного механизма управления конкурентностью класс RIOptimisticProvider хранит как текущее значение, так и исходное значение (значение, которое имело место непосредственно перед текущим значением). Обратите внимание, что если изменения в объекте RowSet не были внесены, его текущие и исходные значения совпадают, оба являясь значениями, с которыми объект RowSet был первоначально заполнен. Однако, как только любые значения в объекте RowSet будут изменены, текущие и исходные значения будут различаться, хотя на этом этапе исходные значения всё ещё являются начальными значениями. При последующих изменениях данных в объекте RowSet его исходные и текущие значения по-прежнему будут отличаться, но исходные значения будут теми, которые ранее были текущими значениями.

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

5.0 Регистрация и уведомление слушателей

В качестве компонентов JavaBeans все наборы строк участвуют в модели событий JavaBeans, наследуя методы регистрации слушателей и уведомления их об изменениях от класса BaseRowSet. Слушатель объекта CachedRowSet — это компонент, который хочет быть уведомлён всякий раз, когда происходит изменение в наборе строк. Например, если объект CachedRowSet содержит результаты запроса, и эти результаты отображаются, скажем, в таблице и столбчатой диаграмме, то таблица и столбчатая диаграмма могут быть зарегистрированы как слушатели набора строк, чтобы они могли обновлять себя в соответствии с изменениями. Чтобы стать слушателями, классы таблицы и столбчатой диаграммы должны реализовать интерфейс RowSetListener. Затем их можно добавить в список слушателей объекта CachedRowSet, как показано в следующих строках кода.
    crs.addRowSetListener(table);
    crs.addRowSetListener(barGraph);
 
Каждый метод класса CachedRowSet, перемещающий указатель или изменяющий данные, также уведомляет зарегистрированных слушателей об изменениях, поэтому слушатели table и barGraph будут уведомлены об изменениях в crs.

6.0 Передача данных тонким клиентам

Одна из основных причин использования объекта CachedRowSet заключается в передаче данных между различными компонентами приложения. Поскольку он сериализуем, объект CachedRowSet можно использовать, например, для отправки результата запроса, выполненного компонентом enterprise JavaBeans, работающим в среде сервера, по сети клиенту, работающему в веб-браузере.

В то время как объект CachedRowSet отключён, он может быть гораздо более компактным, чем объект ResultSet с теми же данными. В результате он может быть особенно подходящим для отправки данных тонкому клиенту, такому как КПК, где использование драйвера JDBC было бы неуместно из-за ограничений ресурсов или соображений безопасности. Таким образом, объект CachedRowSet обеспечивает способ «получения строк» без необходимости реализации полного API JDBC.

7.0 Прокрутка и обновление

Вторая важная задача для объектов CachedRowSet — предоставление прокрутки и обновления для объектов ResultSet, которые сами не предоставляют этих возможностей. Другими словами, объект CachedRowSet может быть использован для расширения возможностей драйвера JDBC (в дальнейшем — "драйвер JDBC"), когда СУБД не полностью поддерживает прокрутку и обновление. Для достижения эффекта преобразования неподдерживающего прокрутку и чтение-только объекта ResultSet в прокручиваемый и обновляемый, программисту необходимо создать объект CachedRowSet, заполненный данными этого объекта ResultSet. Это показано в следующем фрагменте кода, где stmt — объект Statement.
    ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEES");
    CachedRowSetImpl crs = new CachedRowSetImpl();
    crs.populate(rs);
 

Объект crs теперь содержит данные из таблицы EMPLOYEES, точно так же, как и объект rs. Разница заключается в том, что указатель для crs может перемещаться вперёд, назад или к определённой строке, даже если указатель для rs может перемещаться только вперёд. Кроме того, crs обновляемый, даже если rs нет, поскольку по умолчанию объект CachedRowSet является как прокручиваемым, так и обновляемым.

В общем, объект CachedRowSet можно рассматривать как просто набор отключенных строк, кэшируемых вне источника данных. Будучи компактным и сериализуемым, он легко отправляется по сети и хорошо подходит для отправки данных тонкому клиенту. Однако объект CachedRowSet имеет ограничение: его размер ограничен объёмом данных, которые он может хранить в памяти одновременно.

8.0 Получение универсального доступа к данным

Ещё одним преимуществом класса CachedRowSet является то, что он позволяет получать и сохранять данные из источников, отличных от реляционной базы данных. Чтение для набора строк можно реализовать для чтения и заполнения набора строк данными из любого табличного источника данных, включая электронную таблицу или плоский файл. Поскольку и объект CachedRowSet, и его метаданные можно создавать с нуля, компонент, выступающий в роли фабрики наборов строк, может использовать эту возможность для создания набора строк, содержащего данные из источников данных, не использующих SQL. Тем не менее, ожидается, что в большинстве случаев объекты CachedRowSet будут содержать данные, полученные из базы данных SQL с помощью API JDBC.

9.0 Установка свойств

Все наборы строк поддерживают набор свойств, который обычно устанавливается с помощью инструмента. Количество и типы свойств набора строк будут различаться в зависимости от функций набора строк и способа получения данных. Например, наборы строк, получающие данные из объекта ResultSet, должны установить свойства, необходимые для создания подключения к базе данных. Если набор строк использует утилиту DriverManager для создания подключения, ему необходимо установить свойство для URL JDBC, определяющего соответствующий драйвер, и свойства, указывающие имя пользователя и пароль. Если же набор строк использует объект DataSource для создания подключения, что является предпочтительным методом, ему не нужно устанавливать свойство для URL JDBC. Вместо этого ему необходимо установить свойства для логического имени источника данных, имени пользователя и пароля.

ПРИМЕЧАНИЕ: для использования объекта DataSource для создания подключения, объект DataSource должен быть зарегистрирован в службе именования, использующей API Java Naming and Directory Interface (JNDI). Эта регистрация обычно выполняется системным администратором.

Для того, чтобы набор строк мог заполнить себя данными из базы данных, ему необходимо установить свойство команды. Это свойство — это запрос, который является объектом PreparedStatement, что позволяет запросу иметь параметры-заполнители, которые устанавливаются во время выполнения, а не в момент проектирования. Для установки этих параметров-заполнителей со значениями набор строк предоставляет методы-сеттеры для установки значений каждого типа данных, аналогично методам-сеттерам, предоставляемым интерфейсом PreparedStatement.

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


    crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS " +
                   "WHERE CREDIT_LIMIT > ? AND REGION = ?");
  

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

    crs.setInt(1, 5000);
    crs.setString(2, "West");
 

Поле params теперь содержит два элемента, каждый из которых является массивом длиной два элемента. Первый элемент — это номер параметра, второй — значение, которое нужно установить. В данном случае, первый элемент params — это 1, 5000, а второй элемент — это 2, "West". Когда приложение вызывает метод execute, оно в свою очередь вызывает метод чтения объекта RowSet, который, в свою очередь, вызовет метод readData. В рамках своей реализации метод readData получит значения из params и воспользуется ими для установки параметров-заполнителей команды. Следующий фрагмент кода дает представление о том, как это делает чтение, после получения объекта Connection con.


    PreparedStatement pstmt = con.prepareStatement(crs.getCommand());
    reader.decodeParams();
    // decodeParams figures out which setter methods to use and does something
    // like the following:
    //    for (i = 0; i < params.length; i++) {
    //        pstmt.setObject(i + 1, params[i]);
    //    }
 

В этот момент команда для crs — запрос "SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS WHERE CREDIT_LIMIT > 5000 AND REGION = "West". После того, как метод readData выполнит эту команду с помощью следующей строки кода, у него будут данные из rs, с помощью которых он заполнит crs.


     ResultSet rs = pstmt.executeQuery();
 

Представленные фрагменты кода дают представление о том, что происходит за кулисами; они не появятся в приложении, которое не вызовет методы, такие как readData и decodeParams. Напротив, следующий фрагмент кода демонстрирует, что может сделать приложение. Оно устанавливает команду набора строк, устанавливает параметры команды и выполняет команду. Просто вызвав метод execute, crs заполняет себя запрошенными данными из таблицы CUSTOMERS.


    crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS" +
                   "WHERE CREDIT_LIMIT > ? AND REGION = ?");
    crs.setInt(1, 5000);
    crs.setString(2, "West");
    crs.execute();
 

10.0 Разбиение данных на страницы

Поскольку объект CachedRowSet хранит данные в памяти, количество данных, которое он может содержать в любой момент, определяется доступным объёмом памяти. Чтобы обойти это ограничение, объект CachedRowSet может извлекать данные из объекта ResultSet по частям данных, называемым страницами
. Для использования этого механизма, приложение устанавливает количество строк, включаемых в страницу, используя метод setPageSize. Другими словами, если размер страницы установлен в пять, фрагмент из пяти строк данных будет извлечён из источника данных за один раз. Приложение также может необязательно установить максимальное количество строк, которое может быть извлечено за один раз. Если максимальное количество строк установлено в ноль или не установлено, нет ограничения на количество строк, которое может быть извлечено за один раз.

После установки свойств объект CachedRowSet должен быть заполнен данными с помощью метода populate или метода execute. Следующие строки кода демонстрируют использование метода populate. Обратите внимание, что этот вариант метода принимает два параметра: дескриптор ResultSet и строку в объекте ResultSet, с которой начинать извлечение строк.

     CachedRowSet crs = new CachedRowSetImpl();
     crs.setMaxRows(20);
     crs.setPageSize(4);
     crs.populate(rsHandle, 10);
 
При выполнении этого кода crs будет заполнен четырьмя строками из rsHandle, начиная с десятой строки.

Следующий фрагмент кода демонстрирует заполнение объекта CachedRowSet с помощью метода execute, который может или не может принимать объект Connection в качестве параметра. Этот код передаёт execute объекту Connection conHandle.

Обратите внимание на два отличия между следующим фрагментом кода и предыдущим. Во-первых, метод setMaxRows не вызывается, поэтому нет ограничения на количество строк, которое может содержать crs. (Помните, что crs всегда имеет ограничение на хранение данных в памяти.) Второе отличие заключается в том, что методу execute нельзя передать номер строки в объекте ResultSet, с которой нужно начать извлечение строк. Этот метод всегда начинает с первой строки.

     CachedRowSet crs = new CachedRowSetImpl();
     crs.setPageSize(5);
     crs.execute(conHandle);
 
После выполнения этого кода crs будет содержать пять строк данных из объекта ResultSet, полученного командой для crs. Писатель для crs будет использовать conHandle для подключения к источнику данных и выполнения команды для crs. Приложение затем может обрабатывать данные в crs так же, как оно обрабатывает данные в любом другом объекте CachedRowSet.

Для доступа к следующей странице (фрагменту данных) приложение вызывает метод nextPage. Этот метод создаёт новый объект CachedRowSet и заполняет его следующей страницей данных. Например, предположим, что команда объекта CachedRowSet возвращает объект ResultSet rs с 1000 строками данных. Если размер страницы установлен в 100, первый вызов метода nextPage создаст объект CachedRowSet, содержащий первые 100 строк rs. После выполнения необходимых действий с данными в этих первых 100 строках, приложение может снова вызвать метод nextPage, чтобы создать другой объект CachedRowSet со вторыми 100 строками из rs. Данные из первого объекта CachedRowSet больше не будут находиться в памяти, потому что они заменены данными из второго объекта CachedRowSet. После десятого вызова метода nextPage, десятый объект CachedRowSet будет содержать последние 100 строк данных из rs, которые хранятся в памяти. В любой момент времени данные только одного объекта CachedRowSet хранятся в памяти.

Метод nextPage возвращает true, пока текущая страница не является последней страницей строк, и false, когда больше нет страниц. Таким образом, он может быть использован в цикле while для извлечения всех страниц, как показано в следующих строках кода.

     CachedRowSet crs = CachedRowSetImpl();
     crs.setPageSize(100);
     crs.execute(conHandle);

     while(crs.nextPage()) {
         while(crs.next()) {
             . . . // operate on chunks (of 100 rows each) in crs,
                   // row by row
         }
     }
 
После выполнения этого фрагмента кода приложение пройдёт все 1000 строк, но в памяти в любой момент времени будет храниться не более 100 строк.

Интерфейс CachedRowSet также определяет метод previousPage. Так же как метод nextPage аналогичен методу ResultSet, метод next, метод previousPage аналогичен методу ResultSet. Аналогично методу nextPage, previousPage создаёт объект CachedRowSet, содержащий количество строк, установленное как размер страницы. Таким образом, например, метод previousPage мог бы использоваться в цикле while в конце предыдущего фрагмента кода для навигации назад по страницам от последней страницы к первой странице. Метод previousPage также аналогичен методу nextPage, поскольку он может быть использован в цикле while, за исключением того, что он возвращает true, пока есть другая страница перед ним, и false, когда больше нет страниц перед ним.

Размещая курсор после последней строки для каждой страницы, как это делается в следующем фрагменте кода, метод previous перемещается от последней строки к первой строке на каждой странице. Код также мог оставить курсор перед первой строкой на каждой странице и затем использовать метод next в цикле while для навигации по каждой странице от первой строки к последней строке.

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

     crs.afterLast();
     while(crs.previous())  {
         . . . // navigate through the rows, last to first
     {
     while(crs.previousPage())  {
         crs.afterLast();
         while(crs.previous())  {
             . . . // go from the last row to the first row of each page
         }
     }
 
Since:
1.5

Краткое описание полей

Modifier and Type Field Description
static final boolean COMMIT_ON_ACCEPT_CHANGES
Устаревшее.
Поскольку это поле является final (оно является частью интерфейса), его значение нельзя изменить.

Поля, объявленные в интерфейсе java.sql.ResultSet

CLOSE_CURSORS_AT_COMMIT, CONCUR_READ_ONLY, CONCUR_UPDATABLE, FETCH_FORWARD, FETCH_REVERSE, FETCH_UNKNOWN, HOLD_CURSORS_OVER_COMMIT, TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE

Краткое описание методов

Модификатор и тип Метод Описание
void acceptChanges()
Распространяет изменения обновлений, вставок и удалений строк, внесенных в этот объект CachedRowSet, на базовый источник данных.
void acceptChanges(Connection con)
Распространяет все изменения обновлений, вставок и удалений строк на источник данных, поддерживающий этот объект CachedRowSet, используя указанный объект Connection для установления соединения с источником данных.
boolean columnUpdated(int idx)
Указывает, был ли обновлен указанный столбец в текущей строке этого объекта CachedRowSet.
boolean columnUpdated(String columnName)
Указывает, был ли обновлен указанный столбец в текущей строке этого объекта CachedRowSet.
void commit()
Каждый объект CachedRowSet содержит объект Connection из свойств ResultSet или JDBC, переданных в его конструкторы.
CachedRowSet createCopy()
Создает объект RowSet, являющийся глубокой копией данных в этом объекте CachedRowSet.
CachedRowSet createCopyNoConstraints()
Создает объект CachedRowSet, являющийся глубокой копией данных этого объекта CachedRowSet, но независимый от него.
CachedRowSet createCopySchema()
Создает пустую копию объекта CachedRowSet этого объекта CachedRowSet.
RowSet createShared()
Возвращает новый объект RowSet, поддерживаемый теми же данными, что и этот объект CachedRowSet.
void execute(Connection conn)
Заполняет этот объект CachedRowSet данными, используя заданное соединение для получения набора результатов, из которого будут считываться данные.
int[] getKeyColumns()
Возвращает массив, содержащий один или несколько номеров столбцов, указывающих столбцы, образующие ключ, уникально идентифицирующий строку в этом объекте CachedRowSet.
ResultSet getOriginal()
Возвращает объект ResultSet, содержащий исходное значение этого объекта CachedRowSet.
ResultSet getOriginalRow()
Возвращает объект ResultSet, содержащий исходное значение только для текущей строки этого объекта CachedRowSet.
int getPageSize()
Возвращает размер страницы для объекта CachedRowSet.
RowSetWarning getRowSetWarnings()
Получает первое предупреждение, сообщенное вызовами этого объекта RowSet.
boolean getShowDeleted()
Получает boolean, указывающий, отображаются ли строки, помеченные для удаления, в наборе текущих строк.
SyncProvider getSyncProvider()
Получает реализацию SyncProvider для этого объекта CachedRowSet.
String getTableName()
Возвращает идентификатор объекта (таблицы), который использовался для создания этого объекта CachedRowSet.
boolean nextPage()
Увеличивает текущую страницу объекта CachedRowSet.
void populate(ResultSet data)
Заполняет этот объект CachedRowSet данными из заданного объекта ResultSet.
void populate(ResultSet rs, int startRow)
Заполняет этот объект CachedRowSet данными из заданного объекта ResultSet.
boolean previousPage()
Уменьшает текущую страницу объекта CachedRowSet.
void release()
Освобождает текущее содержимое этого объекта CachedRowSet и отправляет событие rowSetChanged всем зарегистрированным слушателям.
void restoreOriginal()
Возвращает этот объект CachedRowSet к его первоначальному значению, то есть значению до последнего набора изменений.
void rollback()
Каждый объект CachedRowSet содержит объект Connection из исходных свойств ResultSet или JDBC, переданных в него.
void rollback(Savepoint s)
Каждый объект CachedRowSet содержит объект Connection из исходных свойств ResultSet, переданных в него.
void rowSetPopulated(RowSetEvent event, int numRows)
Уведомляет зарегистрированных слушателей о том, что объект RowSet в данном объекте RowSetEvent заполнил ряд дополнительных строк.
void setKeyColumns(int[] keys)
Устанавливает поле keyCols этого объекта CachedRowSet заданным массивом номеров столбцов, которые образуют ключ для уникальной идентификации строки в этом объекте CachedRowSet.
void setMetaData(RowSetMetaData md)
Устанавливает метаданные для этого объекта CachedRowSet заданным объектом RowSetMetaData.
void setOriginalRow()
Устанавливает текущую строку в этом объекте CachedRowSet как исходную строку.
void setPageSize(int size)
Устанавливает размер страницы объекта CachedRowSet.
void setShowDeleted(boolean b)
Устанавливает свойство showDeleted заданным значением boolean, которое определяет, отображаются ли строки, помеченные для удаления, в наборе текущих строк.
void setSyncProvider(String provider)
Устанавливает объект SyncProvider для этого объекта CachedRowSet в указанный.
void setTableName(String tabName)
Устанавливает идентификатор таблицы, из которой был получен этот объект CachedRowSet, в заданное имя таблицы.
int size()
Возвращает количество строк в этом объекте CachedRowSet.
Collection<?> toCollection()
Преобразует этот объект CachedRowSet в объект Collection, содержащий все данные этого объекта CachedRowSet.
Collection<?> toCollection(int column)
Преобразует указанный столбец в этом объекте CachedRowSet в объект Collection.
Collection<?> toCollection(String column)
Преобразует указанный столбец в этом объекте CachedRowSet в объект Collection.
void undoDelete()
Отменяет удаление текущей строки и уведомляет слушателей о том, что строка изменилась.
void undoInsert()
Немедленно удаляет текущую строку из этого объекта CachedRowSet, если строка была вставлена, а также уведомляет слушателей о том, что строка изменилась.
void undoUpdate()
Немедленно отменяет последнюю операцию обновления, если строка была изменена.

Методы, объявленные в интерфейсе javax.sql.rowset.Joinable

getMatchColumnIndexes, getMatchColumnNames, setMatchColumn, setMatchColumn, setMatchColumn, setMatchColumn, unsetMatchColumn, unsetMatchColumn, unsetMatchColumn, unsetMatchColumn

Методы, объявленные в интерфейсе java.sql.ResultSet

absolute, afterLast, beforeFirst, cancelRowUpdates, clearWarnings, close, deleteRow, findColumn, first, getArray, getArray, getAsciiStream, getAsciiStream, getBigDecimal, getBigDecimal, getBigDecimal, getBigDecimal, getBinaryStream, getBinaryStream, getBlob, getBlob, getBoolean, getBoolean, getByte, getByte, getBytes, getBytes, getCharacterStream, getCharacterStream, getClob, getClob, getConcurrency, getCursorName, getDate, getDate, getDate, getDate, getDouble, getDouble, getFetchDirection, getFetchSize, getFloat, getFloat, getHoldability, getInt, getInt, getLong, getLong, getMetaData, getNCharacterStream, getNCharacterStream, getNClob, getNClob, getNString, getNString, getObject, getObject, getObject, getObject, getObject, getObject, getRef, getRef, getRow, getRowId, getRowId, getShort, getShort, getSQLXML, getSQLXML, getStatement, getString, getString, getTime, getTime, getTime, getTime, getTimestamp, getTimestamp, getTimestamp, getTimestamp, getType, getUnicodeStream, getUnicodeStream, getURL, getURL, getWarnings, insertRow, isAfterLast, isBeforeFirst, isClosed, isFirst, isLast, last, moveToCurrentRow, moveToInsertRow, next, previous, refreshRow, relative, rowDeleted, rowInserted, rowUpdated, setFetchDirection, setFetchSize, updateArray, updateArray, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateBigDecimal, updateBigDecimal, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBoolean, updateBoolean, updateByte, updateByte, updateBytes, updateBytes, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateClob, updateClob, updateClob, updateClob, updateClob, updateClob, updateDate, updateDate, updateDouble, updateDouble, updateFloat, updateFloat, updateInt, updateInt, updateLong, updateLong, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNString, updateNString, updateNull, updateNull, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateRef, updateRef, updateRow, updateRowId, updateRowId, updateShort, updateShort, updateSQLXML, updateSQLXML, updateString, updateString, updateTime, updateTime, updateTimestamp, updateTimestamp, wasNull

Методы, объявленные в интерфейсе javax.sql.RowSet

addRowSetListener, clearParameters, execute, getCommand, getDataSourceName, getEscapeProcessing, getMaxFieldSize, getMaxRows, getPassword, getQueryTimeout, getTransactionIsolation, getTypeMap, getUrl, getUsername, isReadOnly, removeRowSetListener, setArray, setAsciiStream, setAsciiStream, setAsciiStream, setAsciiStream, setBigDecimal, setBigDecimal, setBinaryStream, setBinaryStream, setBinaryStream, setBinaryStream, setBlob, setBlob, setBlob, setBlob, setBlob, setBlob, setBoolean, setBoolean, setByte, setByte, setBytes, setBytes, setCharacterStream, setCharacterStream, setCharacterStream, setCharacterStream, setClob, setClob, setClob, setClob, setClob, setClob, setCommand, setConcurrency, setDataSourceName, setDate, setDate, setDate, setDate, setDouble, setDouble, setEscapeProcessing, setFloat, setFloat, setInt, setInt, setLong, setLong, setMaxFieldSize, setMaxRows, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNClob, setNClob, setNClob, setNClob, setNClob, setNClob, setNString, setNString, setNull, setNull, setNull, setNull, setObject, setObject, setObject, setObject, setObject, setObject, setPassword, setQueryTimeout, setReadOnly, setRef, setRowId, setRowId, setShort, setShort, setSQLXML, setSQLXML, setString, setString, setTime, setTime, setTime, setTime, setTimestamp, setTimestamp, setTimestamp, setTimestamp, setTransactionIsolation, setType, setTypeMap, setUrl, setURL, setUsername

Методы, объявленные в интерфейсе java.sql.Wrapper

isWrapperFor, unwrap

Подробное описание полей

COMMIT_ON_ACCEPT_CHANGES

@Deprecated static final boolean COMMIT_ON_ACCEPT_CHANGES
Устаревший.
Поскольку это поле является конечным (это часть интерфейса), его значение нельзя изменить.
Принуждает объект CachedRowSet к выполнению SyncProvider изменений при вызове метода acceptChanges(). Если значение установлено в false, изменения не будут сохранены, пока не будет вызван один из методов транзакции интерфейса CachedRowSet.
См. также:
  • commit()
  • rollback()
  • Значения константных полей

Подробное описание методов

populate

void populate(ResultSet data) throws SQLException
Заполняет этот объект CachedRowSet данными из предоставленного объекта ResultSet.

Этот метод может использоваться как альтернатива методу execute, когда приложение имеет подключение к открытому объекту ResultSet. Использование метода populate может быть более эффективным, чем использование версии метода execute без параметров, так как оно не открывает новое подключение и не повторно выполняет команду этого объекта CachedRowSet. Использование метода populate больше связано с удобством по сравнению с использованием версии execute, принимающей объект ResultSet.

Параметры:
data - объект ResultSet, содержащий данные, которые необходимо считать в этот объект CachedRowSet
Исключения:
SQLException - если предоставлен нулевой объект ResultSet или этот объект CachedRowSet не может получить связанный объект ResultSetMetaData
См. также:
  • execute(java.sql.Connection)
  • ResultSet
  • ResultSetMetaData

execute

void execute(Connection conn) throws SQLException
Заполняет этот объект CachedRowSet данными, используя заданное подключение для создания набора результатов, из которого будут считываться данные. Этот метод должен закрывать все созданные соединения с базой данных, чтобы обеспечить отключение этого объекта CachedRowSet, за исключением случаев чтения данных из источника данных или записи данных в источник данных.

Чтец для этого объекта CachedRowSet будет использовать conn для установления подключения к источнику данных, чтобы он мог выполнить команду набора строк и считать данные из результирующего объекта ResultSet в этот объект CachedRowSet. Этот метод также закрывает conn после заполнения этого объекта CachedRowSet.

Если этот метод вызывается, когда реализация уже заполнена, содержимое и метаданные (пере)устанавливаются. Кроме того, если этот метод вызывается до вызова метода acceptChanges для подтверждения незавершенных обновлений, эти обновления теряются.

Параметры:
conn - стандартный объект JDBC Connection с допустимыми свойствами
Исключения:
SQLException - если предоставлен недопустимый объект Connection или произошла ошибка при установлении подключения к источнику данных
См. также:
  • populate(java.sql.ResultSet)
  • Connection

acceptChanges

void acceptChanges() throws SyncProviderException
Распространяет изменения строк обновлений, вставки и удаления, внесенные в этот объект CachedRowSet, в базовый источник данных.

Этот метод обращается к записи этого объекта CachedRowSet, чтобы выполнить работу за кулисами. Стандартные реализации CachedRowSet должны использовать синглтон SyncFactory для получения экземпляра SyncProvider, предоставляющего объект RowSetWriter (запись). Запись попытается распространить изменения, внесенные в этот объект CachedRowSet, обратно в источник данных.

При успешном выполнении метода acceptChanges помимо записи изменений в источник данных, значения в текущей строке становятся значениями в исходной строке.

В зависимости от уровня синхронизации используемой реализации SyncProvider, запись будет сравнивать исходные значения со значениями в источнике данных, чтобы проверить наличие конфликтов. При конфликте реализация RIOptimisticProvider, например, генерирует исключение SyncProviderException и не записывает ничего в источник данных.

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

Некоторые реализации поставщиков могут использовать блокировки для обеспечения отсутствия конфликтов. В таких случаях гарантируется, что запись успешно запишет изменения в источник данных при вызове метода acceptChanges. Этот метод можно вызвать сразу после методов updateRow, insertRow или deleteRow, но более эффективно вызвать его только один раз после внесения всех изменений, чтобы установить только одно соединение.

Примечание: метод acceptChanges() определит, установлено ли значение COMMIT_ON_ACCEPT_CHANGES в значение true или нет. Если оно установлено в true, все обновления в синхронизации сохраняются в источнике данных. В противном случае приложение должно явно вызвать методы commit() или rollback() по мере необходимости.

Исключения:
SyncProviderException - если запись базового поставщика синхронизации не может записать обновления обратно в источник данных
См. также:
  • acceptChanges(java.sql.Connection)
  • RowSetWriter
  • SyncFactory
  • SyncProvider
  • SyncProviderException
  • SyncResolver

acceptChanges

void acceptChanges(Connection con) throws SyncProviderException
Распространяет все изменения строк, вставки и удаления в источник данных, поддерживающий этот объект CachedRowSet, используя указанный объект Connection для установления соединения с источником данных.

Другая версия метода acceptChanges не принимает соединение, потому что она использует объект Connection, уже определённый внутри объекта RowSet, который является соединением, используемым для его первоначальной загрузки.

Этот вариант метода acceptChanges похож на тот, который не принимает аргументов; однако, в отличие от другого варианта, этот вариант можно использовать только в том случае, если базовый источник данных является источником данных JDBC. Обновлённые свойства Connection должны использоваться SyncProvider для сброса конфигурации RowSetWriter, чтобы гарантировать правильную синхронизацию содержимого объекта CachedRowSet.

При успешном выполнении метода acceptChanges, помимо записи изменений в источник данных, значения текущей строки устанавливаются равными значениям исходной строки.

В зависимости от уровня синхронизации используемой реализации SyncProvider, записыватель сравнит исходные значения с значениями в источнике данных для проверки конфликтов. При наличии конфликта реализация RIOptimisticProvider, например, генерирует исключение SyncProviderException и ничего не записывает в источник данных.

Приложение может выбрать перехват объекта SyncProviderException и извлечь объект SyncResolver, который он содержит. Объект SyncResolver перечисляет конфликты строка за строкой и устанавливает блокировку на источнике данных, чтобы предотвратить дальнейшие конфликты во время разрешения текущих. Кроме того, для каждого конфликта он предоставляет методы для проверки конфликта и установки значения, которое должно быть сохранено в источнике данных. После разрешения всех конфликтов приложение должно снова вызвать метод acceptChanges, чтобы записать разрешённые значения в источник данных. Если все значения в источнике данных уже являются значениями для сохранения, метод acceptChanges ничего не делает.

Некоторые реализации поставщика могут использовать блокировки для обеспечения отсутствия конфликтов. В таких случаях гарантируется, что записыватель успешно запишет изменения в источник данных при вызове метода acceptChanges. Этот метод может быть вызван сразу после методов updateRow, insertRow или deleteRow, но более эффективно вызвать его только один раз после внесения всех изменений, чтобы установить только одно соединение.

Примечание: метод acceptChanges() определит, установлен ли COMMIT_ON_ACCEPT_CHANGES в значение true или нет. Если он установлен в значение true, все обновления в синхронизации сохраняются в источнике данных. В противном случае приложение обязательно должно явно вызвать методы commit или rollback, как соответствующим образом.

Parameters:
con - стандартный объект JDBC Connection
Throws:
SyncProviderException - если записыватель базового поставщика синхронизации не может записать обновления обратно в источник данных
See Also:
  • acceptChanges()
  • RowSetWriter
  • SyncFactory
  • SyncProvider
  • SyncProviderException
  • SyncResolver

restoreOriginal

void restoreOriginal() throws SQLException
Восстанавливает этот объект CachedRowSet до его исходного значения, то есть до значения перед последним набором изменений. Если в наборе строк не было изменений или был только один набор изменений, исходное значение — это значение, с которым этот объект CachedRowSet был загружен; в противном случае, исходное значение — это значение, которое было непосредственно перед текущим значением.

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

Throws:
SQLException - если произошла ошибка при отмене текущего значения этого объекта CachedRowSet до его предыдущего значения
See Also:
  • RowSetListener.rowSetChanged(javax.sql.RowSetEvent)

release

void release() throws SQLException
Освобождает текущее содержимое этого объекта CachedRowSet и отправляет событие rowSetChanged всем зарегистрированным слушателям. Любые незавершенные обновления отбрасываются, и набор строк не содержит строк после вызова этого метода. Взаимодействие с базовым источником данных отсутствует, и любые данные набора строк, метаданные и обновления содержимого должны быть необратимыми.

Этот объект CachedRowSet должен блокироваться до тех пор, пока его содержимое и связанные обновления не будут полностью очищены, предотвращая «грязные» чтения другими компонентами, которые удерживают ссылку на этот объект RowSet. Кроме того, содержимое не может быть освобождено до тех пор, пока все компоненты, читающие этот объект CachedRowSet, не завершат свои чтения. Этот объект CachedRowSet должен вернуться к нормальному поведению после генерации события rowSetChanged.

Метаданные, включая свойства JDBC и свойства Synchronization SPI, сохраняются для будущего использования. Важно, чтобы такие свойства, как свойство command, были актуальны для исходного источника данных, из которого был первоначально создан этот объект CachedRowSet.

Этот метод опустошает набор строк, в отличие от метода close, который помечает весь набор строк как восстанавливаемый, чтобы разрешить сборщику мусора ресурсы виртуальной машины Java набора строк.

Throws:
SQLException - если произошла ошибка при очистке содержимого этого объекта CachedRowSet
See Also:
  • RowSetListener.rowSetChanged(javax.sql.RowSetEvent)
  • ResultSet.close()

undoDelete

void undoDelete() throws SQLException
Отменяет удаление текущей строки и уведомляет слушателей о том, что строка изменилась. После вызова этого метода текущая строка больше не помечается для удаления. Этот метод можно вызывать в любое время во время существования набора строк.

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

  • CachedRowSet.absolute
  • CachedRowSet.first
  • CachedRowSet.last
Throws:
SQLException - если (1) текущая строка не была удалена или (2) курсор находится в строке вставки, перед первой строкой или после последней строки
See Also:
  • undoInsert()
  • ResultSet.cancelRowUpdates()

undoInsert

void undoInsert() throws SQLException
Немедленно удаляет текущую строку из этого объекта CachedRowSet, если строка была вставлена, а также уведомляет слушателей о том, что строка изменилась. Этот метод можно вызывать в любое время во время существования набора строк, и, предполагая, что текущая строка находится в пределах ограничений исключения (см. ниже), он отменяет вставку строки текущей строки.

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

  • CachedRowSet.absolute
  • CachedRowSet.first
  • CachedRowSet.last
Throws:
SQLException - если (1) текущая строка не была вставлена или (2) курсор находится перед первой строкой, после последней строки или в строке вставки
See Also:
  • undoDelete()
  • ResultSet.cancelRowUpdates()

undoUpdate

void undoUpdate() throws SQLException
Немедленно отменяет последнюю операцию обновления, если строка была изменена. Этот метод можно вызвать для отмены обновлений всех столбцов до тех пор, пока все обновления в строке не будут отменены до состояния непосредственно перед последней синхронизацией (acceptChanges) или загрузкой. Этот метод также можно вызвать во время выполнения обновлений в строке вставки.

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

Throws:
SQLException - если курсор находится перед первой строкой или после последней строки в этом объекте CachedRowSet
See Also:
  • undoDelete()
  • undoInsert()
  • ResultSet.cancelRowUpdates()

columnUpdated

boolean columnUpdated(int idx) throws SQLException
Указывает, обновлялась ли указанная колонка в текущей строке этого CachedRowSet объекта.
Параметры:
idx - int, определяющий колонку, которую следует проверить на обновления
Возвращает:
true, если указанная колонка была видимо обновлена; false в противном случае
Выбрасывает:
SQLException - если курсор находится на строке вставки, до первой строки или после последней строки
См. также:
  • DatabaseMetaData.updatesAreDetected(int)

columnUpdated

boolean columnUpdated(String columnName) throws SQLException
Указывает, обновлялась ли указанная колонка в текущей строке этого CachedRowSet объекта.
Параметры:
columnName - объект String, содержащий имя колонки, которую следует проверить на обновления
Возвращает:
true, если колонка была видимо обновлена; false в противном случае
Выбрасывает:
SQLException - если курсор находится на строке вставки, до первой строки или после последней строки
См. также:
  • DatabaseMetaData.updatesAreDetected(int)

toCollection

Collection<?> toCollection() throws SQLException
Преобразует этот CachedRowSet объект в объект Collection, который содержит все данные этого CachedRowSet объекта. Реализации имеют некоторую свободу в том, как они могут представлять этот Collection объект из-за абстрактной природы фреймворка Collection. Каждая строка должна быть полностью представлена либо в реализации общего назначения Collection, либо в специализированной реализации Collection, например, объект TreeMap или объект Vector. Значение SQL-колонки NULL должно быть представлено как null на языке программирования Java.

Стандартная реализация для интерфейса CachedRowSet использует объект TreeMap для набора строк, значения в каждой строке содержатся в объектах Vector. Ожидается, что большинство реализаций сделают то же самое.

Тип коллекции TreeMap гарантирует, что карта будет в порядке возрастания ключей, отсортированных по естественному порядку класса ключа. Каждый ключ ссылается на объект Vector, соответствующий одной строке объекта RowSet. Таким образом, размер каждого объекта Vector должен быть точно равен количеству столбцов в объекте RowSet. Ключ, используемый коллекцией TreeMap, определяется реализацией, которая может выбрать использовать набор ключей, доступный в внутренней табличной структуре RowSet благодаря ключу, уже заданному либо в объекте RowSet, либо в базовых данных SQL.

Возвращает:
объект Collection, содержащий значения в каждой строке в этом объекте CachedRowSet
Выбрасывает:
SQLException - если при создании коллекции произошла ошибка
См. также:
  • toCollection(int)
  • toCollection(String)

toCollection

Collection<?> toCollection(int column) throws SQLException
Преобразует указанную колонку в этом объекте CachedRowSet в объект Collection. Реализации имеют некоторую свободу в том, как они могут представлять этот Collection объект из-за абстрактной природы фреймворка Collection. Каждое значение колонки должно быть полностью представлено либо в реализации общего назначения Collection, либо в специализированной реализации Collection, например, объект Vector. Значение SQL-колонки NULL должно быть представлено как null на языке программирования Java.

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

Параметры:
column - int, указывающий колонку, значения которой следует представить в объекте Collection
Возвращает:
объект Collection, содержащий значения, хранящиеся в указанной колонке этого объекта CachedRowSet
Выбрасывает:
SQLException - если при создании коллекции произошла ошибка или предоставлен недопустимый идентификатор колонки
См. также:
  • toCollection()
  • toCollection(String)

toCollection

Collection<?> toCollection(String column) throws SQLException
Преобразует указанную колонку в этом объекте CachedRowSet в объект Collection. Реализации имеют некоторую свободу в том, как они могут представлять этот Collection объект из-за абстрактной природы фреймворка Collection. Каждое значение колонки должно быть полностью представлено либо в реализации общего назначения Collection, либо в специализированной реализации Collection, например, объект Vector. Значение SQL-колонки NULL должно быть представлено как null на языке программирования Java.

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

Параметры:
column - объект String, содержащий имя колонки, значения которой следует представить в коллекции
Возвращает:
объект Collection, содержащий значения, хранящиеся в указанной колонке этого объекта CachedRowSet
Выбрасывает:
SQLException - если при создании коллекции произошла ошибка или предоставлен недопустимый идентификатор колонки
См. также:
  • toCollection()
  • toCollection(int)

getSyncProvider

SyncProvider getSyncProvider() throws SQLException
Возвращает реализацию SyncProvider для этого объекта CachedRowSet. Внутренне этот метод используется набором строк для инициирования операций чтения или записи между набором строк и источником данных. Например, набору строк может потребоваться получить доступ к читателю набора строк (объект RowSetReader) из SyncProvider, чтобы позволить набору строк быть заполненным.
     RowSetReader rowsetReader = null;
     SyncProvider provider =
         SyncFactory.getInstance("javax.sql.rowset.provider.RIOptimisticProvider");
         if (provider instanceof RIOptimisticProvider) {
             rowsetReader = provider.getRowSetReader();
         }
 
Предполагая, что rowsetReader является приватным, доступным полем в реализации набора строк, когда приложение вызывает метод execute, оно в свою очередь вызывает метод readData читателя для заполнения объекта RowSet.
     rowsetReader.readData((RowSetInternal)this);
 

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

Возвращает:
объект SyncProvider, установленный при создании набора строк, или, если он не был установлен, — поставщик по умолчанию
Выбрасывает:
SQLException - если при возвращении объекта SyncProvider произошла ошибка
См. также:
  • setSyncProvider(java.lang.String)

setSyncProvider

void setSyncProvider(String provider) throws SQLException
Устанавливает объект SyncProvider для этого объекта CachedRowSet на указанный. Этот метод позволяет сбросить объект SyncProvider.

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

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

Параметры:
provider - объект String, содержащий полное имя класса реализации SyncProvider
Выбрасывает:
SQLException - если при попытке сбросить реализацию SyncProvider произошла ошибка
См. также:
  • getSyncProvider()

size

int size()
Возвращает количество строк в этом объекте CachedRowSet.
Возвращает:
количество строк в наборе строк

setMetaData

void setMetaData(RowSetMetaData md) throws SQLException
Устанавливает метаданные для этого CachedRowSet объекта с помощью указанного RowSetMetaData объекта. Когда объект RowSetReader считывает содержимое набора строк, он создаёт объект RowSetMetaData и инициализирует его с помощью методов в реализации RowSetMetaData. Реализация по умолчанию использует класс RowSetMetaDataImpl. Когда читатель завершил чтение содержимого набора строк, этот метод вызывается внутренне для передачи объекта RowSetMetaData в набор строк.
Parameters:
md - объект RowSetMetaData, содержащий метаданные о столбцах в этом объекте CachedRowSet
Throws:
SQLException - если в набор строк переданы некорректные метаданные

getOriginal

ResultSet getOriginal() throws SQLException
Возвращает объект ResultSet, содержащий исходное значение этого объекта CachedRowSet.

Курсор объекта ResultSet должен быть расположен перед первой строкой. Кроме того, возвращаемый объект ResultSet должен иметь следующие свойства:

  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.CONCUR_UPDATABLE

Исходное значение для объекта RowSet - это значение, которое у него было до последней синхронизации с базовым источником данных. Если синхронизаций не было, исходное значение будет таким, каким объект RowSet был заполнен. Этот метод вызывается внутренне, когда приложение вызывает метод acceptChanges, и объект SyncProvider реализован для проверки конфликтов. В этом случае писатель сравнивает исходное значение со значением, которое сейчас находится в источнике данных, чтобы проверить конфликты.

Returns:
объект ResultSet, содержащий исходное значение для этого объекта CachedRowSet
Throws:
SQLException - если произошла ошибка при создании объекта ResultSet

getOriginalRow

ResultSet getOriginalRow() throws SQLException
Возвращает объект ResultSet, содержащий исходное значение только для текущей строки этого объекта CachedRowSet.

Курсор объекта ResultSet должен быть расположен перед первой строкой. Кроме того, возвращаемый объект ResultSet должен иметь следующие свойства:

  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.CONCUR_UPDATABLE
Returns:
исходный результат набора для строки
Throws:
SQLException - если текущей строки нет
See Also:
  • setOriginalRow()

setOriginalRow

void setOriginalRow() throws SQLException
Устанавливает текущую строку в этом объекте CachedRowSet в качестве исходной строки.

Этот метод вызывается внутренне после того, как любые изменённые значения в текущей строке были синхронизированы с источником данных. Текущая строка должна быть помечена как больше не вставленная, удалённая или обновлённая.

Вызов метода setOriginalRow необратим.

Throws:
SQLException - если текущей строки нет или при сбросе содержимого исходной строки возникла ошибка
See Also:
  • getOriginalRow()

getTableName

String getTableName() throws SQLException
Возвращает идентификатор объекта (таблицы), который был использован для создания этого объекта CachedRowSet. Это имя может быть установлено несколько раз, и спецификация не накладывает никаких ограничений на то, сколько раз это может произойти или должны ли стандартные реализации отслеживать предыдущие имена таблиц.
Returns:
объект String, содержащий имя таблицы, являющейся источником данных для этого объекта CachedRowSet, или null, если для таблицы не было установлено имени
Throws:
SQLException - если при возвращении имени таблицы возникла ошибка
See Also:
  • ResultSetMetaData.getTableName(int)

setTableName

void setTableName(String tabName) throws SQLException
Устанавливает идентификатор таблицы, из которой был получен этот объект CachedRowSet, в указанное имя таблицы. Писатель использует это имя, чтобы определить, какую таблицу использовать при сравнении значений в источнике данных со значениями объекта CachedRowSet во время попытки синхронизации. Идентификатор таблицы также указывает, куда должны быть записаны изменённые значения из этого объекта CachedRowSet.

Реализация этого объекта CachedRowSet может получить имя из объекта RowSetMetaDataImpl.

Parameters:
tabName - объект String, идентифицирующий таблицу, из которой был получен этот объект CachedRowSet; не может быть null, но может быть пустой строкой
Throws:
SQLException - если при присвоении имени таблицы возникла ошибка или tabName имеет значение null
See Also:
  • RowSetMetaData.setTableName(int, java.lang.String)
  • RowSetWriter
  • SyncProvider

getKeyColumns

int[] getKeyColumns() throws SQLException
Возвращает массив, содержащий один или несколько номеров столбцов, указывающих на столбцы, образующие ключ, который однозначно идентифицирует строку в этом объекте CachedRowSet.
Returns:
массив, содержащий номер или номера столбцов, которые указывают, какие столбцы составляют первичный ключ для строки в этом объекте CachedRowSet. Этот массив должен быть пустым, если столбцы не представляют собой первичный ключ.
Throws:
SQLException - если этот объект CachedRowSet пуст
See Also:
  • setKeyColumns(int[])
  • Joinable.getMatchColumnIndexes()
  • Joinable.getMatchColumnNames()

setKeyColumns

void setKeyColumns(int[] keys) throws SQLException
Устанавливает поле CachedRowSet этого объекта keyCols с заданным массивом номеров столбцов, который образует ключ для однозначной идентификации строки в этом объекте CachedRowSet.

Если объект CachedRowSet становится частью объекта JoinRowSet, ключи, определённые этим методом и получившиеся ограничения, сохраняются, если столбцы, обозначенные как ключевые, также становятся столбцами соответствия.

Parameters:
keys - массив int, указывающий столбцы, которые образуют первичный ключ для этого объекта CachedRowSet; каждый элемент массива должен быть больше 0 и меньше или равен числу столбцов в этом наборе строк
Throws:
SQLException - если какое-либо из чисел в данном массиве не является допустимым для этого набора строк
See Also:
  • getKeyColumns()
  • Joinable.setMatchColumn(String)
  • Joinable.setMatchColumn(int)

createShared

RowSet createShared() throws SQLException
Возвращает новый объект RowSet, поддерживаемый теми же данными, что и у этого объекта CachedRowSet. По сути, оба объекта CachedRowSet имеют курсор над одними и теми же данными. В результате любые изменения, внесённые дубликатом, видны оригинальному и любым другим дубликатам, так же как и изменение, внесённое оригиналом, видно всем его дубликатам. Если дубликат вызывает метод, который изменяет базовые данные, вызываемый метод уведомляет всех зарегистрированных слушателей так же, как он бы это сделал при вызове оригиналом объекта CachedRowSet.

Кроме того, любой объект RowSet, созданный этим методом, будет иметь те же свойства, что и у этого объекта CachedRowSet. Например, если этот объект CachedRowSet является только для чтения, все его дубликаты также будут только для чтения. Если он изменяется на обновляемый, дубликаты также становятся обновляемыми.

ПРИМЕЧАНИЕ: Если несколько потоков обращаются к объектам RowSet, созданным методом createShared(), поведение, указанное ниже, предназначено для сохранения целостности общих данных: чтения и записи всех общих объектов RowSet должны выполняться последовательно между каждым объектом и единственной базовой табличной структурой.

Returns:
новый общий объект RowSet, имеющий те же свойства, что и у этого объекта CachedRowSet, и имеющий курсор над одними и теми же данными
Throws:
SQLException - если при возникновении ошибки или клонирование не поддерживается в базовой платформе
See Also:
  • RowSetEvent
  • RowSetListener

createCopy

CachedRowSet createCopy() throws SQLException
Создаёт объект RowSet, являющийся глубокой копией данных в этом объекте CachedRowSet. В отличие от объекта RowSet, созданного с помощью вызова createShared, обновления, внесённые в копию исходного объекта RowSet, не должны быть видны исходному объекту RowSet. Также любые обработчики событий, зарегистрированные с исходным объектом RowSet, не должны иметь область действия над новыми копиями RowSet. Кроме того, должны сохраняться любые установленные ограничения.
Возвращает:
новый объект RowSet, являющийся глубокой копией этого объекта CachedRowSet и полностью независимый от этого объекта CachedRowSet
Исключение:
SQLException - если произошла ошибка при создании копии этого объекта CachedRowSet
См. также:
  • createShared()
  • createCopySchema()
  • createCopyNoConstraints()
  • RowSetEvent
  • RowSetListener

createCopySchema

CachedRowSet createCopySchema() throws SQLException
Создаёт объект CachedRowSet, являющийся пустой копией этого объекта CachedRowSet. Копия не должна содержать никакого содержимого, а только представлять структуру таблицы исходного объекта CachedRowSet. Кроме того, первичные или внешние ключи, установленные в исходном объекте CachedRowSet, должны быть одинаково применены к новому пустому объекту CachedRowSet. В отличие от объекта RowSet, созданного с помощью вызова метода createShared, обновления, внесённые в копию этого объекта CachedRowSet с помощью метода createCopySchema, не должны быть видны ему.

Приложения могут сформировать объект WebRowSet из объекта CachedRowSet, возвращаемого этим методом, для экспорта определения схемы RowSet в XML для дальнейшего использования.

Возвращает:
Пустую копию этого объекта CachedRowSet
Исключение:
SQLException - если произошла ошибка при клонировании структуры этого объекта CachedRowSet
См. также:
  • createShared()
  • createCopySchema()
  • createCopyNoConstraints()
  • RowSetEvent
  • RowSetListener

createCopyNoConstraints

CachedRowSet createCopyNoConstraints() throws SQLException
Создаёт объект CachedRowSet, являющийся глубокой копией данных этого объекта CachedRowSet, но независимый от него. В отличие от объекта RowSet, созданного с помощью вызова метода createShared, обновления, внесённые в копию этого объекта CachedRowSet, не должны быть видны ему. Также любые обработчики событий, зарегистрированные с этим объектом CachedRowSet, не должны иметь область действия над новым объектом RowSet. Кроме того, любые ограничения, установленные для этого объекта CachedRowSet, не должны поддерживаться в копии.
Возвращает:
новый объект CachedRowSet, являющийся глубокой копией этого объекта CachedRowSet и полностью независимый от этого объекта CachedRowSet
Исключение:
SQLException - если произошла ошибка при создании копии этого объекта CachedRowSet
См. также:
  • createCopy()
  • createShared()
  • createCopySchema()
  • RowSetEvent
  • RowSetListener

getRowSetWarnings

RowSetWarning getRowSetWarnings() throws SQLException
Возвращает первое предупреждение, сообщённое вызовами на этот объект RowSet. Последующие предупреждения на этом объекте RowSet будут присоединены к объекту RowSetWarning, возвращаемому этим методом. Цепочка предупреждений автоматически очищается каждый раз, когда считывается новая строка. Этот метод не может быть вызван на объекте RowSet, который был закрыт; при этом будет брошено исключение SQLException.
Возвращает:
объект RowSetWarning первое предупреждение или null, если их нет
Исключение:
SQLException - если этот метод был вызван на закрытом RowSet
См. также:
  • RowSetWarning

getShowDeleted

boolean getShowDeleted() throws SQLException
Возвращает значение, указывающее, отображаются ли в наборе текущих строк строки, помеченные для удаления. Если возвращается boolean, удалённые строки видны вместе с текущими. Если возвращается true, строки не видны в наборе текущих строк. Значение по умолчанию - false.

Стандартные реализации rowset могут ограничить это поведение по соображениям безопасности или для лучшей адаптации к определённым сценариям развертывания. Это оставлено на усмотрение реализации и не является стандартным поведением.

Примечание: разрешение удалённых строк оставаться видимыми усложняет поведение некоторых стандартных методов реализации JDBC RowSet. Однако большинство пользователей rowset могут просто проигнорировать эту дополнительную деталь, поскольку только очень специализированные приложения, вероятно, захотят воспользоваться этой функцией.

Возвращает:
true, если удалённые строки видны; false в противном случае
Исключение:
SQLException - если реализация rowset не может определить, видны ли строки, помеченные для удаления
См. также:
  • setShowDeleted(boolean)

setShowDeleted

void setShowDeleted(boolean b) throws SQLException
Устанавливает свойство showDeleted заданному значению boolean, которое определяет, отображаются ли строки, помеченные для удаления, в наборе текущих строк. Если значение установлено в true, удалённые строки немедленно отображаются в наборе текущих строк. Если значение установлено в false, удалённые строки становятся невидимыми в наборе текущих строк.

Стандартные реализации rowset могут ограничить это поведение по соображениям безопасности или для лучшей адаптации к определённым сценариям развертывания. Это оставлено на усмотрение реализации и не является стандартным поведением.

Параметры:
b - true, если удалённые строки должны быть показаны; false в противном случае
Исключение:
SQLException - если реализация rowset не может сбросить, должны ли отображаться удалённые строки
См. также:
  • getShowDeleted()

commit

void commit() throws SQLException
Каждый объект CachedRowSet имеет объект SyncProvider, содержащий объект Connection из свойств ResultSet или JDBC, переданных в его конструкторы. Этот метод оборачивает метод Connection commit, чтобы позволить гибкое автоматическое подтверждение или поддержку транзакционного управления без автоматического подтверждения.

Делает все изменения, выполненные методом acceptChanges() с момента предыдущего подтверждения/отката, постоянными. Этот метод следует использовать только при отключённом режиме автоматического подтверждения.

Исключение:
SQLException - если произошла ошибка доступа к базе данных или этот объект Connection в этом объекте CachedRowSet находится в режиме автоматического подтверждения
См. также:
  • Connection.setAutoCommit(boolean)

rollback

void rollback() throws SQLException
Каждый объект CachedRowSet имеет объект SyncProvider, содержащий объект Connection из исходных свойств ResultSet или JDBC, переданных ему.

Отменяет все изменения, внесённые в текущей транзакции. Этот метод следует использовать только при отключённом режиме автоматического подтверждения.

Исключение:
SQLException - если произошла ошибка доступа к базе данных или этот объект Connection в этом объекте CachedRowSet находится в режиме автоматического подтверждения.

rollback

void rollback(Savepoint s) throws SQLException
Каждый объект CachedRowSet имеет объект SyncProvider, содержащий объект Connection из исходных свойств ResultSet или JDBC, переданных ему.

Отменяет все изменения, внесённые в текущей транзакции, до последней метки транзакции Savepoint. Этот метод следует использовать только при отключённом режиме автоматического подтверждения.

Параметры:
s - Метка транзакции Savepoint
Исключение:
SQLException - если произошла ошибка доступа к базе данных или этот объект Connection в этом объекте CachedRowSet находится в режиме автоматического подтверждения.

rowSetPopulated

void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException
Уведомляет зарегистрированных слушателей о том, что объект RowSet в заданном объекте RowSetEvent заполнил несколько дополнительных строк. Параметр numRows гарантирует, что это событие будет срабатывать только каждые numRow.

Источник события можно получить с помощью метода event.getSource.

Parameters:
event - объект RowSetEvent, содержащий объект RowSet, являющийся источником событий
numRows - при заполнении интервал строк, по которому должно срабатывать событие CachedRowSet заполнения; значение по умолчанию равно нулю; не может быть меньше fetchSize или нуля
Throws:
SQLException - numRows < 0 or numRows < getFetchSize()

populate

void populate(ResultSet rs, int startRow) throws SQLException
Заполняет этот объект CachedRowSet данными из заданного объекта ResultSet. Несмотря на связь с методом populate(ResultSet), предоставляется дополнительный параметр для задания стартовой позиции в ResultSet, с которой следует начать заполнение экземпляра CachedRowSet.

Этот метод может использоваться как альтернатива методу execute, когда приложение имеет подключение к открытому объекту ResultSet. Использование метода populate может быть эффективнее, чем использование версии метода execute без параметров, поскольку оно не открывает новое подключение и не повторно выполняет команду этого объекта CachedRowSet. Использование метода populate скорее связано с удобством по сравнению с использованием версии метода execute, принимающей объект ResultSet.

Parameters:
rs - объект ResultSet, содержащий данные для чтения в этот объект CachedRowSet
startRow - позиция в ResultSet, с которой следует начать заполнение записей в этот объект CachedRowSet
Throws:
SQLException - если предоставлен нулевой объект ResultSet или этот объект CachedRowSet не может получить связанный объект ResultSetMetaData
See Also:
  • execute(java.sql.Connection)
  • populate(ResultSet)
  • ResultSet
  • ResultSetMetaData

setPageSize

void setPageSize(int size) throws SQLException
Устанавливает размер страницы для объекта CachedRowSet. Объект CachedRowSet может быть настроен для заполнения себя порциями строк размером page-size. При вызове методов populate() или execute(), объект CachedRowSet извлекает дополнительную страницу в соответствии с исходным SQL-запросом, используемым для заполнения RowSet.
Parameters:
size - размер страницы объекта CachedRowSet
Throws:
SQLException - если при установке размера страницы CachedRowSet возникает ошибка, или если размер страницы меньше 0.

getPageSize

int getPageSize()
Возвращает размер страницы для объекта CachedRowSet
Returns:
размер страницы int

nextPage

boolean nextPage() throws SQLException
Увеличивает текущую страницу объекта CachedRowSet. Это приводит к тому, что реализация CachedRowSet извлекает следующую страницу строк размером page-size и заполняет RowSet, если оставшиеся строки остаются в пределах области исходного SQL-запроса, используемого для заполнения RowSet.
Returns:
true, если существуют другие страницы; false, если это последняя страница
Throws:
SQLException - если при извлечении следующей страницы возникает ошибка, или если этот метод вызывается преждевременно до populate или execute.

previousPage

boolean previousPage() throws SQLException
Уменьшает текущую страницу объекта CachedRowSet. Это приводит к тому, что реализация CachedRowSet извлекает предыдущую страницу строк размером page-size и заполняет RowSet. Количество строк, возвращаемых на предыдущей странице, должно всегда оставаться в пределах области исходного SQL-запроса, используемого для заполнения RowSet.
Returns:
true, если предыдущая страница успешно извлечена; false, если это первая страница.
Throws:
SQLException - если при извлечении предыдущей страницы возникает ошибка, или если этот метод вызывается преждевременно до populate или execute.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.sql.rowset/javax/sql/rowset/CachedRowSet.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API