[펌] ORA-01000: maximum open cursors exceeded

From : http://database.sarang.net/?inc=read&aid=12590&criteria=oracle&subcrit=&id=112&limit=20&keyword=v%24statement&page=25

[질문]ORA-01000: 최대 열기 커서 수를 초과했습니다 .
작성자
박진만
작성일
2002-11-15 16:06:12
조회수
2,077

안녕하세요.

 

저는 경상대학교에 재학중인 박진만이라고 합니다.

다름이 아니라, 클럽/동호회를 만드는데 생성시

데이터를 오라클 DB에 insert하고 Create하는 부분인데,,

무결성을 위해.. 12개를 처리하는데 이때 트랜젝션 처리를 합니다.

그러면 10개정도를 생성하고 Drop시킨후 다시 한 10개쯤 만들면

DB가 이상해집니다. 결국 15~6개 정도 만들면 아래와 같은 에러메세지가 나오고

결국은 오라클을 재부팅해야되는 결과가 나옵니다.

 

다음과 같은 에러가 발생하는데 어떻게 해결해야 할런지요.

java.sql.SQLException: ORA-00604: 순환 SQL 레벨 1 에 오류가 발생했습니다 ORA-01000: 최대 열기 커서 수를 초과했습니다 .

많은 도움을 부탁드립니다.

 

그리고 DB에 입력하는 부분의 소스를 첨부합니다.

몇일째 해결이 안되서 걱정입니다.

그럼 좋은 하루되시길바라며...,

 

< % @ page contentType="text/html; charset=euc-kr" import="java.sql.*, java.util.*" % >

< % @ page import="com.worlsys.lib.*" % >

 

< %

String ip = request.getRemoteAddr();

String name = request.getParameter("name");

String url = request.getParameter("url");

int category = Integer.parseInt(request.getParameter("category"));

String desc = request.getParameter("desc");

String open = request.getParameter("open");

 

//////////////////////////////////////////sysop_id , sysop 가져오기

String sysop = request.getParameter("sysop");

String sysop_id = "jmpark";

 

String logo = name + " 클럽 입니다.";

String welcome = name + " 클럽에 오신걸 환영합니다.";

 

DBConnectionManager dbMgr = null;

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

PreparedStatement pstmt = null;

 

String tableName ="";

String sqlStr = "";

 

try{

dbMgr = DBConnectionManager.getInstance();

conn = dbMgr.getConnection("jspDB");

 

// 자동 커밋을 안되게

conn.setAutoCommit(false);

stmt = conn.createStatement();

//// Table [suw900tl] - 클럽정보 테이블

tableName = " SUW900TL ";

sqlStr = "insert into " + tableName + " ( suw900_no, suw900_name, suw900_url, suw900_category, suw900_date, suw900_sysop, suw900_membernum, suw900_open, suw900_desc, suw900_status, suw900_logo, suw900_welcome, suw900_grade, suw900_capacity, suw900_ip, suw900_curcapacity, suw900_updatedate ) ";

sqlStr = sqlStr + " values ( suw900.nextval , ?, ?, ?, sysdate, ?, 1, ?, ?, '1', ?, ?, 4, 5, ?, 0, sysdate) ";

 

pstmt = conn.prepareStatement(sqlStr);

 

pstmt.setString(1, name);

pstmt.setString(2, url);

pstmt.setInt(3, category);

pstmt.setString(4, sysop);

pstmt.setString(5, open);

pstmt.setString(6, desc);

pstmt.setString(7, logo);

pstmt.setString(8, welcome);

pstmt.setString(9, ip);

 

pstmt.executeUpdate();

pstmt.close();

 

//// Table [suw920tl] - 클럽 가입 회원 테이블

// 클럽번호 가져오기

sqlStr = " select suw900_no from " + tableName + " where suw900_name='" + name + "'";

rs = stmt.executeQuery(sqlStr);

rs.next();

int clubno = rs.getInt("suw900_no");

rs.close();

stmt.close();

 

tableName = " SUW920TL ";

sqlStr = "insert into " + tableName + " ( suw920_no, suw920_clubno, suw920_id, suw920_nickname, suw920_grade, suw920_open, suw920_status, suw920_date, suw920_ip, suw920_updatedate ) ";

sqlStr = sqlStr + " values ( suw920.nextval , ?, ?, ?, 1, '1', '1', sysdate, ?, sysdate) ";

 

pstmt = conn.prepareStatement(sqlStr);

 

pstmt.setInt(1, clubno);

pstmt.setString(2, sysop_id);

pstmt.setString(3, sysop);

pstmt.setString(4, ip);

 

pstmt.executeUpdate();

pstmt.close();

 

//// Table [suw921tl] - 각 클럽 회원 등급 테이블

tableName = " SUW921TL ";

sqlStr = "insert into " + tableName + " ( suw921_no, suw921_name, suw921_clubno, suw921_date, suw921_updatedate ) ";

sqlStr = sqlStr + " values ( 1, '시삽', "+ clubno +", sysdate, sysdate) ";

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

sqlStr = "insert into " + tableName + " ( suw921_no, suw921_name, suw921_clubno, suw921_date, suw921_updatedate ) ";

sqlStr = sqlStr + " values ( 2, '부시삽', "+ clubno +", sysdate, sysdate) ";

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

sqlStr = "insert into " + tableName + " ( suw921_no, suw921_name, suw921_clubno, suw921_date, suw921_updatedate ) ";

sqlStr = sqlStr + " values ( 3, '정회원', "+ clubno +", sysdate, sysdate) ";

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

sqlStr = "insert into " + tableName + " ( suw921_no, suw921_name, suw921_clubno, suw921_date, suw921_updatedate ) ";

sqlStr = sqlStr + " values ( 4, '준회원', "+ clubno +", sysdate, sysdate) ";

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

//// Table [suw910tl] - 클럽 공지사항/게시판/자료실 정보(레이아웃) 등급 테이블

tableName = " SUW910TL ";

sqlStr = "insert into " + tableName + " ( suw910_no, suw910_clubno, suw910_name, suw910_class, suw910_seq, suw910_read, suw910_write, suw910_date, suw910_updatedate ) ";

sqlStr = sqlStr + " values ( suw910.nextval, "+ clubno +", '공지사항', '1', 1, 4, 4,sysdate, sysdate) ";

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

sqlStr = "insert into " + tableName + " ( suw910_no, suw910_clubno, suw910_name, suw910_class, suw910_seq, suw910_read, suw910_write, suw910_date, suw910_updatedate ) ";

sqlStr = sqlStr + " values ( suw910.nextval, "+ clubno +", '자유게시판', '2', 1, 4, 4,sysdate, sysdate) ";

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

sqlStr = "insert into " + tableName + " ( suw910_no, suw910_clubno, suw910_name, suw910_class, suw910_seq, suw910_read, suw910_write, suw910_date, suw910_updatedate ) ";

sqlStr = sqlStr + " values ( suw910.nextval, "+ clubno +", '자료실', '3', 1, 4, 4,sysdate, sysdate) ";

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

//// Table [suw911tl] - 전체 및 클럽 공지사항/게시판/자료실 테이블

tableName = " SUW911TL ";

sqlStr = "create sequence suw911_" + Integer.toString(clubno);

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

sqlStr = "create table suw911tl_" + Integer.toString(clubno);

sqlStr = sqlStr + " ( suw911_no number primary key not null, suw911_rel number not null, ";

sqlStr = sqlStr + " suw911_ord number not null, suw911_depth number not null, ";

sqlStr = sqlStr + " suw911_subject varchar2(50) not null, suw911_id varchar2(10), ";

sqlStr = sqlStr + " suw911_name varchar2(20), suw911_email varchar2(40), ";

sqlStr = sqlStr + " suw911_passwd varchar2(10), suw911_content1 varchar2(4000) not null, ";

sqlStr = sqlStr + " suw911_content2 varchar2(4000), suw911_savefile varchar2(100), ";

sqlStr = sqlStr + " suw911_realfile varchar2(100), suw911_date date default sysdate not null, ";

sqlStr = sqlStr + " suw911_readnum number default 0 not null, suw911_ip varchar2(15) not null, ";

sqlStr = sqlStr + " suw911_emailyesno char(1), suw911_htmlyesno char(1), ";

sqlStr = sqlStr + " suw911_filesize number default 0, suw911_updatedate date default sysdate, ";

sqlStr = sqlStr + " suw911_boardno number default 0 not null )";

 

pstmt = conn.prepareStatement(sqlStr);

pstmt.executeUpdate();

pstmt.close();

 

conn.commit();

 

}catch(SQLException ex){

if( conn != null ) try { conn.rollback(); } catch(SQLException ex1) {}

out.println(ex.toString());

}catch(Exception ex){

if( conn != null ) try { conn.rollback(); } catch(SQLException ex1) {}

out.println(ex.toString());

}finally{

if ( conn != null ) try { conn.setAutoCommit(true); } catch(SQLException ex1) {}

if ( rs != null ) try { rs.close(); } catch(SQLException ex1) {}

if ( stmt != null ) try { stmt.close(); } catch(SQLException ex1) {}

if ( pstmt != null ) try { pstmt.close(); } catch(SQLException ex1) {}

if ( conn != null ) dbMgr.freeConnection("jspDB", conn);

 

// out.print("<meta http-equiv='refresh' content=0;URL=../index.jsp>");

}

% >

이 글에 대한 댓글이 총 1건 있습니다.

스크립트를 보질않고 에러결과만으로 유추해보면

결과수행 후 DB connection를 제대로 끊어주질 못하는듯...

SQL>select * from v$session;

으로 실행 후 session이 없어지는지 LOCK이 잡히는지 확인해보시고

SQL> show parameter processes

SQL> show parameter open_cursors

로 너무작게 잡혀있는지 확인해보세요.

kk님이 2002-11-16 11:24:17에 작성한 댓글입니다.

by 오서비네 | 2007/06/19 04:52 | Oracle | 트랙백

<< 이전 페이지     다음 페이지 >>