Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с закрытием курсоров в БД Oracle при использовании JDBC / 9 сообщений из 9, страница 1 из 1
19.04.2013, 16:17:12
    #38233012
newbsite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
Подскажите, может кто уже наступал на грабли связанные с закрытием курсоров, при использовании JDBC драйвера. При выполнении следующего кода:
Код: 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.
............
       ResourceLocator resourceLocator = ResourceLocator.getInstance(this.getServletContext());
       connection = resourceLocator.getConnection();
         .....................
         cs = connection.prepareCall("{ call monitor.Test(?,?,?)} ");				
         cs.setString(1, request.getHeader("dtS"));
	 cs.setString(2, request.getHeader("dtPo"));
	 cs.registerOutParameter(3, Types.CLOB);
	 cs.execute();
	 long light = cs.getClob(3).length();
	 String str = cs.getClob(3).getSubString(1, (int) light);
	 response.getWriter().println(str);				
	
	.................
		} catch (AccessEcseption e) {
		} catch (Exception e) {
			e.printStackTrace();
		}
        finally {
            try {
            	if (ps != null){
            		ps.close();
            	}
                if (rs != null){
                	rs.close();
                }   
                if (cs != null){
                	cs.close();
                	cs = null;                	
                }
                connection.close();
            	connection = null;
            	
            }
            catch (Exception ex1) { 
            
            }
        } 



в бд открывается курсор, который не закрывается. Через некоторое время получаю ошибку ora-01000


Хранимая процедура простейшая:
Код: plsql
1.
2.
3.
4.
5.
6.
create or replace
PROCEDURE Test(dtS in varchar2, dtPo in varchar2, json out clob) AS 

BEGIN         
   json := '{"records":[]}';
END GET_FOREX_KASSA;


Oracle Database 11g Release 2
...
Рейтинг: 0 / 0
19.04.2013, 16:23:19
    #38233029
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
On 19.04.2013 17:17, newbsite wrote:

> в бд открывается курсор, который не закрывается. Через некоторое время получаю ошибку ora-01000


А как выглядит курсор, из V$OPEN_CURSOR?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.04.2013, 16:29:46
    #38233053
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
newbsite,

а где собственно сам курсор, ни ResultSet'ов в приведенном Java, ни курсоров в PL/SQL не увидел ? И что за объекты ps и rs вы close'ите, а нигде в коде выше их нет?
...
Рейтинг: 0 / 0
19.04.2013, 16:34:24
    #38233065
newbsite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
Denis Popov,
SQL TEXT: BEGIN monitor.GET_FOREX_KASSA(:1 ,:2 ,:3 ); END;
CURSOR_TYPE: SESSION CURSOR CACHED
...
Рейтинг: 0 / 0
19.04.2013, 16:41:50
    #38233090
newbsite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
just_vladimir
В том то и дело курсоров как таковых в коде нет, а в бд Oracle при использовании JDBC драйвера создается курсор, который не закрывается.
...
Рейтинг: 0 / 0
19.04.2013, 16:51:16
    #38233110
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
On 19.04.2013 17:34, newbsite wrote:

> SQL TEXT: BEGIN monitor.GET_FOREX_KASSA(:1 ,:2 ,:3 ); END;

У тебя в коде показан вызыв monitor.Test(?,?,?), а курсор - monitor.GET_FOREX_KASSA(), так все-таки что именно вызывается? Может не в этом месте что-то не закрывается?
...
Рейтинг: 0 / 0
19.04.2013, 17:02:02
    #38233143
newbsite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
Denis Popov,
Не в названии дело, я просто уже экспериментирую с разными процедурами, перед постом сюда забыл поменять название.
Вызов в сервлете:
Код: java
1.
	cs = connection.prepareCall("{ call monitor.GET_FOREX_KASSA(?,?,?)} ");


процедура:
Код: plsql
1.
2.
3.
4.
5.
create or replace
PROCEDURE GET_FOREX_KASSA(dtS in varchar2, dtPo in varchar2, json out clob) AS  
BEGIN         
   json := '{"records":[]}';
END GET_FOREX_KASSA;
...
Рейтинг: 0 / 0
19.04.2013, 17:31:50
    #38233234
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
Локально у себя я такого не наблюдаю:

Код: 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.
Connection con;
...
CallableStatement cs = null;
Statement st = con.createStatement();
st.execute(
  "create or replace procedure GET_FOREX_KASSA(dtS in varchar2, dtPo in varchar2, json out clob) AS\n" +
  "begin\n" +
  "   json := '{\"records\":[]}';\n" +
  "end GET_FOREX_KASSA;"
);
try {
  cs = con.prepareCall("{ call GET_FOREX_KASSA(?,?,?)} ");
  cs.setString(1, "dtS");
  cs.setString(2, "dtPo");
  cs.registerOutParameter(3, Types.CLOB);
  cs.execute();
  long light = cs.getClob(3).length();
  String str = cs.getClob(3).getSubString(1, (int) light);
  System.out.println(str);
} catch (Exception e) {
  e.printStackTrace();
} finally {
  try {
    if (cs != null) {
      cs.close();
    }
  } catch (Exception ex1) {

  }
}
ResultSet rs = st.executeQuery("select * from V$OPEN_CURSOR where sid = (select sid from V$MYSTAT where rownum = 1)");
while (rs.next()) {
  System.out.println(
    rs.getString("cursor_type") + ": " + rs.getString("sql_text")
  );
}
rs.close();
st.close();

con.close();


в списке открытых курсоров вызов процедуры отсутствует, а у тебя как? Какой реально класс используется для Connection, это ведь пул, а не одиночное соединение? Или может попробовать взять последний оракловый драйвер.
...
Рейтинг: 0 / 0
19.04.2013, 17:49:31
    #38233283
newbsite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с закрытием курсоров в БД Oracle при использовании JDBC
Denis Popov большое спасибо за помощь, после включения трассировки, разобрался. В сервлете был вызов еще одной хранимой процедуры, после вызова которой не закрывалось соединение
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с закрытием курсоров в БД Oracle при использовании JDBC / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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