Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Закрытие ResultSet / 24 сообщений из 24, страница 1 из 1
20.03.2013, 10:31:13
    #38190997
Alexey123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
Как правильно закрывать 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
20.03.2013, 10:40:48
    #38191011
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
Alexey123,
я делаю
Код: java
1.
if(rs!=null) try {rs.close()}catch(SQLException e){}


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

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

Бред.

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

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

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.03.2013, 10:51:23
    #38191033
Alexey123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
Документация 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
20.03.2013, 10:52:20
    #38191035
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
GKS_Samara,
по п.2 странно. Если отвалилась сеть - будет райзе?
...
Рейтинг: 0 / 0
20.03.2013, 11:01:59
    #38191050
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
Добрый день, Petro123!

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

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

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

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

А я думаю не просто в лог, а наверх (например в RuntimeException). Операция не выполнена, транзакция должна откатится.
Так какая Ваша форма записи? Java 6.
...
Рейтинг: 0 / 0
20.03.2013, 11:08:10
    #38191066
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
GKS_Samara,
странно. У меня всегда были длинные транзакции - по 8 часов. И райзе было только при НОВОМ запросе.
Надо проверить. ОК.
...
Рейтинг: 0 / 0
20.03.2013, 11:12:08
    #38191072
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
Добрый день, 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
20.03.2013, 11:13:04
    #38191075
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
Добрый день, Petro123!

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

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

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

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

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.03.2013, 11:19:32
    #38191087
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
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
20.03.2013, 11:39:30
    #38191123
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
в 7
Код: java
1.
try(Closeable resource =....)

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

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

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

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

Код: 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
21.03.2013, 10:09:28
    #38192643
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
Alexey123Ваше мнение? не плохо бы проверить на null
...
Рейтинг: 0 / 0
21.03.2013, 10:24:22
    #38192678
Alexey123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
am_sasaAlexey123Ваше мнение? не плохо бы проверить на null
Если пытаемся закрыть ресурс null, то это ошибка. В conn.close(); породится NullPointerException которое запишется в лог.
...
Рейтинг: 0 / 0
21.03.2013, 10:31:56
    #38192690
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие ResultSet
Добрый день, Alexey123!

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

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

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

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


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