powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Закрытие ResultSet
24 сообщений из 24, страница 1 из 1
Закрытие ResultSet
    #38190997
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно закрывать ResultSet ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
		try {
			PreparedStatement pstmt = null;
			ResultSet rs = null;
			try {
				pstmt = conn.prepareStatement("select ...");
				rs = pstmt.executeQuery();
				.....
			} finally {
				rs.close();//возможны исключения
				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}


При таком варианте в rs.close() возможны исключения, в результате PreparedStatement останется открытым.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
		try {
			PreparedStatement pstmt = null;
			try {
				pstmt = conn.prepareStatement("select ...");
				ResultSet rs = null;
				try {
					rs = pstmt.executeQuery();
					.......
				} finally {
					rs.close();
				}
			} finally {
				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}


Такой вроде правильнее, но очень громоздкий и нечитабельный.
А как пишите вы?
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191011
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey123,
я делаю
Код: java
1.
if(rs!=null) try {rs.close()}catch(SQLException e){}


остальное по аналогии
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191013
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191019
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey123,
1.
вариант в лоб
- поставь выше строчку pstmt.close();.....даже потому что создаётся раньше.
2. дай ссылку на документацию, с чего это там исключение.
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191025
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Petro123!

> 1.
> вариант в лоб
> - поставь выше строчку pstmt.close();.....даже потому что создаётся раньше.

Бред.

> 2. дай ссылку на документацию, с чего это там исключение.

С того, что БД это внешняя система, которая может умереть сама, или
отвалится сеть.
Поэтому _любая_ операция может привести к исключению. Другое дело, что
исключение при закрытии коннекта кроме логов никуда более попадать не
должна.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191033
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Документация ResultSet close

void close()
throws SQLException

Releases this ResultSet object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed.

The closing of a ResultSet object does not close the Blob, Clob or NClob objects created by the ResultSet. Blob, Clob or NClob objects remain valid for at least the duration of the transaction in which they are creataed, unless their free method is invoked.

When a ResultSet is closed, any ResultSetMetaData instances that were created by calling the getMetaData method remain accessible.

Note: A ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results.

Calling the method close on a ResultSet object that is already closed is a no-op.

Throws:
SQLException - if a database access error occurs


Т.е. его закрывать необязательно???
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191035
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_Samara,
по п.2 странно. Если отвалилась сеть - будет райзе?
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191050
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Petro123!

> по п.2 странно. Если отвалилась сеть - будет райзе?

Да.
ResultSet создаёт объекты на стороне БД.

close() освобождает эти объекты. При этом это может не пройти- вот и
исключительная ситуация. Другое дело, что при этом клиент не может
сделать ничего в принципе, поэтому пишем в лог и всё.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191060
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_SamaraДругое дело, что при этом клиент не может
сделать ничего в принципе, поэтому пишем в лог и всё.

А я думаю не просто в лог, а наверх (например в RuntimeException). Операция не выполнена, транзакция должна откатится.
Так какая Ваша форма записи? Java 6.
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191066
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_Samara,
странно. У меня всегда были длинные транзакции - по 8 часов. И райзе было только при НОВОМ запросе.
Надо проверить. ОК.
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191072
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Alexey123!

>> Другое дело, что при этом клиент не может
>> сделать ничего в принципе, поэтому пишем в лог и всё.
> А я думаю не просто в лог, а наверх (например в RuntimeException).

Зависит от логике приложения.
И от операции. Если update был, то да- он скорее всего не закомичен.
А если нам надо было одну строку прочитать и про БД забыть- то пофиг.

> Операция не выполнена, транзакция должна откатится.

Если она есть. Что маловероятно при наличии ResultSet :)

> Так какая Ваша форма записи? Java 6.

Лучше переходить на 7ку, тем более что у 6ки заканчивается техподдержка.
Но писал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  PreparedStatement ps = null;
  ResultSet rs = null;
  try {
    ps = ....;
    ....
    rs = ps.executeQuery();
    ....
  } catch (SqlException e) {
    ...
  } finally {
    if (ps != null)
      try {
        ps.close();
      } catch (SqlException e) {
        log.warn("....", e);
      }
  }



--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191075
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Petro123!

> странно. У меня всегда были длинные транзакции - по 8 часов.

Вот по 8 часов точно не надо.

> И райзе было только при НОВОМ запросе.

Я думаю, зависит от драйвера. Теоретически имеет право пожаловаться.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191087
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_Samara,
- теоретически он не должен создавать в БД что-то
А практически у меня так:

Код: java
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.
			try {
				Statement stmt = conn.createStatement(
						ResultSet.TYPE_SCROLL_INSENSITIVE,
						ResultSet.CONCUR_READ_ONLY);
				Statement stmtPers = conn.createStatement(
						ResultSet.TYPE_SCROLL_INSENSITIVE,
						ResultSet.CONCUR_READ_ONLY);
				ResultSet rs = stmt.executeQuery(DB_Q_DOG);
				rs.last();
				Number nCount = rs.getRow();
				rs.first();

				do {
					rs.getString("id"));
					..................
				} while (rs.next());
				rs.close();
				stmt.close();
			} finally {
				conn.close();
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		return Ixxxxxxx;
	}
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191123
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 7
Код: java
1.
try(Closeable resource =....)

- закрываются сами

в 6 пишете хелпер
Код: java
1.
2.
3.
4.
public static close(Closeable resource){
try{resource.close();}
catch ....
}
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191200
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман, интересная мысль. А если её как-то так развить (ведь интерфейса Closeable нет):

Код: java
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.
	public static void closeResources(Object... resources){
		for (Object resource: resources){
			for(Method method : resource.getClass().getMethods()){
				if (method.getName().equalsIgnoreCase("close")){
					try {
						method.invoke(resources,new Object[0]);
					} catch (Exception e) {
						throw new RuntimeException("Error close resource"+resource,e);
					}
				}
			}
		}
	}


		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			pstmt = conn.prepareStatement("select ...");
			rs = pstmt.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeResources(rs,pstmt);
		}
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191222
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey123,

так развивать не стоит )
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38191324
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey123,

Проще на 7-ку перейти. :)
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38192633
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой вариант:

Код: java
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
	public static void SQLClose(Connection conn) {
		try {
			conn.close();
		} catch (Exception e) {
			System.err.println("Error on close DB connection");
			e.printStackTrace();
		}
	}

	public static void SQLClose(PreparedStatement pstmt) {
	//аналогично
	}

	public static void SQLClose(ResultSet rs) {
	//аналогично
	}

	public static void SQLClose(Object... resources) {
		for (Object resource : resources) {
			if (resource == null) {
				(new NullPointerException("Try close null sql resource"))
						.printStackTrace();
				return;
			}
			if (resource instanceof ResultSet)
				SQLClose((ResultSet) resource);
			else if (resource instanceof PreparedStatement)
				SQLClose((PreparedStatement) resource);
			else if (resource instanceof Connection)
				SQLClose((Connection) resource);
			else throw new IllegalArgumentException("Don't closed SQL resource: "+resource);
		}
	}

	....

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = ods.getConnection();
			pstmt = conn.prepareStatement("select 1 from dual");
			rs = pstmt.executeQuery();
			System.out.println(rs);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			 SQLClose(rs,pstmt,conn);
		}



Никаких проглатываний исключений, так как секция finally пишет только в лог. Лагман был прав, спасибо ему.
А рефлексия медленнее работает:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	public static void closeResources(Object... resources) {
		for (Object resource : resources) {
			if (resource == null)
				(new NullPointerException("Try close null resource"))
						.printStackTrace();
			else {
				try {
					Method method = resource.getClass().getMethod("close");
					method.setAccessible(true);
					method.invoke(resource, new Object[0]);
				} catch (Exception e) {
					(new RuntimeException("Error close resource" + resource, e))
							.printStackTrace();
				}
			}
		}
	}



Ваше мнение?
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38192643
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey123Ваше мнение? не плохо бы проверить на null
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38192678
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
am_sasaAlexey123Ваше мнение? не плохо бы проверить на null
Если пытаемся закрыть ресурс null, то это ошибка. В conn.close(); породится NullPointerException которое запишется в лог.
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38192690
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Alexey123!

> Если пытаемся закрыть ресурс null, то это ошибка. В conn.close();
> породится NullPointerException которое запишется в лог.

Создание и пробрасывание exception - долгая операция.
Лучше проверить на null - это вообще ничего.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38192701
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_SamaraСоздание и пробрасывание exception - долгая операция.
Лучше проверить на null - это вообще ничего.

Согласен с Вами, но возникновение null это ошибка, а не рядовая ситуация. Её не должно быть.
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38192849
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey123Если пытаемся закрыть ресурс null, то это ошибка. В conn.close(); породится NullPointerException которое запишется в лог.
ещё раз.
Проверь пожалуйста данный кейс:
- открой длинную транзакцию получением класса.
- выдерни шнур сети из сетевой
- сделай Класс.Close;
Будет ошибка?
Емли будет - сюда её текст.
Это ведь не трудно чем рассуждать?
Те классы и провайдеры что мне попадались - не возбуждали исключение на закрытие и уничтожение объекта. СУБД было фиолетово что кто-то отключился.
...
Рейтинг: 0 / 0
Закрытие ResultSet
    #38192854
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и потом, что мешало разработчикам ResultSet внутри Close проверить на Null.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Закрытие ResultSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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