본문 바로가기

Programming &/Database

ORA-01000: 최대 열기 커서 수를 초과했습니다.

에 갑자기 뭔 커서 수가 초과했다는 메시지가 나오면서 페이지 오류가 나왔다.

Tomcat 로그를 보니
java.sql.SQLException: ORA-01000: 최대 열기 커서 수를 초과했습니다.
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:790)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1031)
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:830)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1124)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1264)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:1643)

.................

요 모양으로 나온다.

일단 커서수를 확인해보기 위해서 오라클에서 sys 로 로그인해서 쿼리를 날려보자.

SELECT sql_text, count(sid) cnt
FROM v$OPEN_CURSOR
GROUP BY sql_text
ORDER BY cnt DESC

SQL_TXT                                                  CNT
select mem_gbn, mem_seq from ....              32
select web_id from ......................              29
SELECT count(year) as tot ..........              28
SELECT SUBSTR(IN_DATE,0,4) AS              28
select count(in_date) as tot from ..               20
select mem_gbn,mem_seq from ....               18
select * from web_member where.                14
.......................

쫌 있다...

원하는 유저에 대해서만 보고 싶다면

SELECT sql_text, count(sid) cnt 
FROM v$OPEN_CURSOR
WHERE user_name = 'SCOTT'
GROUP BY sql_text 
ORDER BY cnt DESC

조건절에 user_name 을 적어주면 되겠다.


문제는 저 위에서 CNT에 해당하는 것이다.

저 커서수가 좀 많다면...
동시접속수가 많은 사이트라면 클수도 있겠지만
테스트 환경이라서 접속수가 많지 않다면
저 CNT 증감을 체크해보면 어떤 페이지의 어떤 쿼리가 문제인지 대략적인 감은 잡을 수 있을것이다.


원인 : PreparedStatement 가 close() 되지 않은경우가 대부분의 원인이 된다.
해결 : PreparedStatement 가 사용된경우 close() 처리등 확인