Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Что такое ResultSet? / 15 сообщений из 15, страница 1 из 1
29.03.2007, 11:46:36
    #34424028
Guest1234567890
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
Не понимаю почему объект 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
29.03.2007, 12:02:47
    #34424116
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
автор// Бежим...
rs.beforeFirst();
while(resultSet.next()) {

куда? rs==resultSet

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

куда? rs==resultSet

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

Опечатался, понятно же о чем речь...
...
Рейтинг: 0 / 0
29.03.2007, 12:10:59
    #34424161
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
просто похоже на такую же очепятку в программе. ну и после collection.close() resultsetы трогать нельзя
...
Рейтинг: 0 / 0
29.03.2007, 12:17:09
    #34424194
Guest1234567890
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
exppпросто похоже на такую же очепятку в программе. ну и после collection.close() resultsetы трогать нельзя
Так я их и не трогаю, ситуация то простая: есть 2 транзакции, в одной я заполняю таблицу данными, делаю коммит. Теперь во второй делаю выборку из этой таблицы, получаю курсор. В новой транзакции добавляю строки в таблицу, делаю коммит. Начинаю бежать по курсору и, о ужас, вижу эти строки! Аналогично с удалением... Выполнял запрос был один результат, начал бежать по нему стал другой.
...
Рейтинг: 0 / 0
29.03.2007, 12:31:18
    #34424276
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
resultset это не rowset и не dataset из .net а. это курсор на серваке а не выбранные данные. до конца так и не ясно. но похоже что ведут они себя нормально
...
Рейтинг: 0 / 0
29.03.2007, 12:42:48
    #34424328
Guest1234567890
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
Получается, что сделав в нем однажды next();previous(); я вполне могу оказаться в каком угодно месте ResultSet'а?
...
Рейтинг: 0 / 0
29.03.2007, 12:49:49
    #34424363
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
у них есть типы. может по может. там вроду бы есть updateable/non updable
...
Рейтинг: 0 / 0
29.03.2007, 13:05:43
    #34424427
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
2 Guest1234567890 уровень изоляции транзакций какой у вас?
...
Рейтинг: 0 / 0
29.03.2007, 13:11:49
    #34424455
Guest1234567890
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
READ_COMMITED, пробовал на REPEATABLE_READ и SERIALIZABLE. Результат тот же (если после SELECT'а делать commit).
...
Рейтинг: 0 / 0
29.03.2007, 13:29:13
    #34424522
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
...
Рейтинг: 0 / 0
29.03.2007, 13:41:52
    #34424575
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
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
29.03.2007, 15:45:07
    #34425040
Мужик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое ResultSet?
Denis Popov Guest1234567890В результате имеем 3 записи на выходе!
У меня не получается воспроизвести, на выходе 2 записи, Oracle 10.2. Какая у тебя БД, какие JDBC?


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

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


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