ORA-12518 에러
오라클 데이터베이스에 대한 오류 중 하나입니다.
동시에 리스너가 클라이언트 연결을 전달할 수 없는 증상을 의미합니다.
오류 증상 |
Cannot create PoolableConnectionFactory (Listener refused the connection with the following error: |
가장 쉬운 해결 방법은 프로세스의 숫자와 세션, 트랜젝션의 크기를 키워주는 것입니다.
alter system set processes=500 scope=spfile;
alter system set sessions=555 scope=spfile;
alter system set transactions=610 scope=spfile;
shutdown abort
startup
생각해볼 만한 주제는 오류 횟수를 줄이는 것입니다.
"기본 값"에서 안정적으로 동작하는 지 ORA-12518이 발생할 확률을 줄이는 코딩을 하는 것도 방법입니다.
물론 실제 서비스에서는 동시접속자가 많아질 것을 대비하여, 키워줘도 되는 부분입니다.
실제 DBA 등의 역할 분장도 있을 것입니다.
태스트 서버 환경이 되어 있는 곳이라고 하면, 프로그래머가 DBMS 시스템을 관리하는 기능을 손댈 일이 많지 않을 거라고 봅니다.
물론 알아두면 좋습니다.
* 인위적으로 오류를 유발하는 방법 소개
Emp 테이블과 Member 테이블을 예로 문제가 발생하는 사례를 소개하겠습니다.
1. EMP, Member 테이블 논리적인 소프트웨어 뷰 (DB View 구현: X) |
예제는 JSP/Java 기반으로 작성된 코드입니다.
public void main(){ List<EmpView> list = select(); // 1번: 콜(시작 지점) } // 예 public List<EmpView> function select() { content.setAddress ( rset.getString("address") ); content.setPay ( rset.getInt("pay") ); // 3번: 풀 종료 if ( list != null ) member = updateMember( list ); // 예 4번: 문제의 시작점 }
// Call By Reference (X) - Call By Value로 표현함. private List<EmpView> function updateMember( List<EmpView> list ){
int index = 0; for ( EmpView emp : list ) { emp = findMember( emp ); // 5번: 문제지점 list.set( index, emp ); // 수정 index++; } return list; } private EmpView function findMember( EmpView emp ){ String SQL = ""; pstmt.setInt( 1, emp.getMemberid(); emp.setEmail( rset.getInt("email") ); return emp; } |
2. 문제 유발 - 소스코드 |
1~3번의 코드로 살펴보면, 약 O(logn~n) 정도면 처리가 되는 부분입니다.
하지만, 4~6번의 5~6번을 보면, 물리적 DB 연결 풀(Pool)이 계속 생성되고, 종료되는 현상을 발견할 수 있습니다.
물리적 DB 연결 풀(Pool)이 계속 생성되면서, 프로세스, 세션 등의 낭비를 초래하는 것을 발견할 수 있습니다.
Oracle 초기 기본값 설정으로 된 환경에서 운영하면, 감지하는 것으로 보입니다.
해당 문제를 도식화 해본다면,
|
3. 문제 |
select()를 호출하고 난 후에, updateMember()를 호출하게 됩니다.
findMember()를 list<EmpView>의 갯수만큼 동작하도록 합니다.
이러한 코드는 효율을 저하시키는 행위를 하게 합니다.
이러한 문제는 차라리 SQL문을 통해서 해결할 수 있습니다.
select emp.id, emp.member_id, emp.address, emp.pay, emp.regi_ip, member.email, member.nickname from empview, member where emp.member_id = member.id;
public void main(){ List<EmpView> list = select(); // 1번: 콜(시작 지점) } // 예 public List<EmpView> function select() { content.setAddress ( rset.getString("address") ); content.setPay ( rset.getInt("pay") ); content.setNickname ( rset.getString("nickname") ); content.setEmail ( rset.getString("email") ); // 3번: DB Pool 및 연결 종료 } |
4. 개선된 코드 |
SQL 문을 개선함으로써, Pool 생성 횟수를 줄일 수 있습니다.
* 참고 자료
1. Oracle 11g R2 ORA-12518 추가 접속이 되지 않을때, https://m.blog.naver.com/PostView.nhn?blogId=pumba3&logNo=10139494929, 건파, 2012. 5.
2. how to increase the processes parameter in init.ora in oracle 11g, https://community.oracle.com/thread/2177493, Oracle Community, 2011.2
3. ORA-00018 maximum number of sessions exceeded, http://nimishgarg.blogspot.kr/2011/11/ora-00018-maximum-number-of-sessions.html, Blogger, 2011.11
'공부 > 오라클12g(Oracle)' 카테고리의 다른 글
첫 시작하기 - 계정 (0) | 2017.11.05 |
---|