powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что такое ResultSet?
15 сообщений из 15, страница 1 из 1
Что такое ResultSet?
    #34424028
Guest1234567890
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понимаю почему объект ResultSet в некоторых случаях изменяет свое состояние во время работы. Работаю с через JDBC с блокировочником. Имею 2 транзакции (connection1, connection2).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
connection2.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
// Тестовые данные
statement = connection.createStatement();
statement.executeUpdate("INSERT INTO TEST (ID, VAL) VALUES (1, 'a')");
statement.executeUpdate("INSERT INTO TEST (ID, VAL) VALUES (2, 'b')");
connection.commit();

// Выборка
statement2 = connection.createStatement();
ResultSet rs = statement2.executeQuery("SELECT ID, VAL FROM TEST");

// Фантом
statement.executeUpdate("INSERT INTO TEST (ID, VAL) VALUES (3, 'c')");
connection.commit();

// Бежим...
rs.beforeFirst();
 while (resultSet.next()) {
     for ( int  i =  1 ; i <= resultSet.getMetaData().getColumnCount(); ++i) {
        System.out.print(resultSet.getObject(i) + "   ");
    }
    System.out.println("");
}

В результате имеем 3 записи на выходе! Аналогично записи могут неожиданно исчезать. Получается база отдает курсор прямо на таблицу? Действительно, если заменить запрос например на
Код: plaintext
1.
2.
3.
SELECT T.ID, T.VAL 
FROM TEST T
    JOIN TEST T2 ON T2.ID = T.ID
то ResultSet не меняется по ходу работы.

Ок, а теперь так
Код: plaintext
1.
2.
3.
4.
// Выборка
statement2 = connection.createStatement();
ResultSet rs = statement2.executeQuery("SELECT ID, VAL FROM TEST");
rs.first();
ResultSet снова не изменился! Кэш JDBC драйвера или набор записей создался сервером только когда я начал по нему бежать?
Это вообще нормальное поведение объекта, глюк базы, глюк драйвера или что? Я не нашел в спецификации JDBC такого (признаюсь, искал плохо :))
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424116
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор// Бежим...
rs.beforeFirst();
while(resultSet.next()) {

куда? rs==resultSet

каша какя то. мысли в порядок приведите
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424135
Guest1234567890
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
expp автор// Бежим...
rs.beforeFirst();
while(resultSet.next()) {

куда? rs==resultSet

каша какя то. мысли в порядок приведите

Опечатался, понятно же о чем речь...
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424161
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто похоже на такую же очепятку в программе. ну и после collection.close() resultsetы трогать нельзя
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424194
Guest1234567890
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exppпросто похоже на такую же очепятку в программе. ну и после collection.close() resultsetы трогать нельзя
Так я их и не трогаю, ситуация то простая: есть 2 транзакции, в одной я заполняю таблицу данными, делаю коммит. Теперь во второй делаю выборку из этой таблицы, получаю курсор. В новой транзакции добавляю строки в таблицу, делаю коммит. Начинаю бежать по курсору и, о ужас, вижу эти строки! Аналогично с удалением... Выполнял запрос был один результат, начал бежать по нему стал другой.
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424276
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resultset это не rowset и не dataset из .net а. это курсор на серваке а не выбранные данные. до конца так и не ясно. но похоже что ведут они себя нормально
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424328
Guest1234567890
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получается, что сделав в нем однажды next();previous(); я вполне могу оказаться в каком угодно месте ResultSet'а?
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424363
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у них есть типы. может по может. там вроду бы есть updateable/non updable
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424427
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Guest1234567890 уровень изоляции транзакций какой у вас?
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424455
Guest1234567890
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
READ_COMMITED, пробовал на REPEATABLE_READ и SERIALIZABLE. Результат тот же (если после SELECT'а делать commit).
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424522
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34424575
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest1234567890В результате имеем 3 записи на выходе!
У меня не получается воспроизвести, на выходе 2 записи, Oracle 10.2. Какая у тебя БД, какие JDBC?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
    connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

    Statement statement;
    Statement statement2;
    ResultSet resultSet;

// Тестовые данные
    statement = connection.createStatement();
     try  {
      statement.execute("drop table TEST");
    }  catch  (SQLException e) {}
    statement.execute("create table TEST (ID number(9), VAL varchar2(32))");

    statement.executeUpdate("INSERT INTO TEST (ID, VAL) VALUES (1, 'a')");
    statement.executeUpdate("INSERT INTO TEST (ID, VAL) VALUES (2, 'b')");
    connection.commit();

// Выборка
//    statement2 = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
    statement2 = connection.createStatement();
    resultSet = statement2.executeQuery("SELECT ID, VAL FROM TEST");

// Фантом
    statement.executeUpdate("INSERT INTO TEST (ID, VAL) VALUES (3, 'c')");
    connection.commit();

// Бежим...
//    resultSet.beforeFirst();
     while  (resultSet.next()) {
       for  ( int  i =  1 ; i <= resultSet.getMetaData().getColumnCount(); ++i) {
        System.out.print(resultSet.getObject(i) + "   ");
      }
      System.out.println("");
    }

Результат:
Код: plaintext
1.
2.
1   a   
2   b  
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34425040
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov Guest1234567890В результате имеем 3 записи на выходе!
У меня не получается воспроизвести, на выходе 2 записи, Oracle 10.2. Какая у тебя БД, какие JDBC?


MaxDB 7.6.00.34, JDBC 7.6.00.30.5567.
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34425104
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Что такое ResultSet?
    #34427346
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МужикMaxDB 7.6.00.34, JDBC 7.6.00.30.5567.

Думается это специфика БД. В Оракле результат другой - курсор видит данные на момент открытия.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Что такое ResultSet?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]