어플리케이션에서 커넥션을 배워야 하는 이유
클라이언트와 오라클 데이터베이스가 하나의 서버 위에 있는 구성은 드물다. 보통은 클라이언트 프로그램과 오라클 데이터베이스 프로그램은 네트워크로 연결되어 있다. 이러한 이유로 인해 두 프로세스 간 연결을 맺어야 하는데 이 때 시간이 소요되어 해당 과정에 대해 숙지함으로써 성능을 향상시켜보자.
오라클 커넥션과 소켓
네트워크 안에는 여러 소켓이 있다. 소켓은 "주소 + 포트번호"로 이루어져 있다. 주소와 포트번호를 통해 소켓을 서로 구분한다. 커넥션 동작에서 주요하게 살펴보아야 하는 것은 "연락을 기다리는 프로세스 존재"와 송신측에서의 "주소 및 포트를 지정"해야 한다는 것이다. 오라클에서 수신을 기다리고 있는 프로세스를 리스너라고 한다. 해당 프로세스는 서버 프로세스가 아니다. 송신을 하는 쪽은 클라이언트 프로세스이다.
오라클 커넥션 과정
- 리스너 기동
- 앱의 커넥션
- 서버 프로세스 생성
리스너 기동
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = myserver.example.com)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME=myfubardb)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = fubar)
)
(SID_DESC =
(GLOBAL_DBNAME=tulsa)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = tulsa)
)
)
리스너의 기동을 위해 위의 설정 파일이 필요하다. SID_LIST_LISTENER를 작성하지 않아도 리스너 프로세스를 기동시킬 수 있다. 오라클은 데이터베이스 별 설정을 파일에 적지 않고도 동적으로 설정하는 기능이 있다. 이를 통해 리스너에게 필요한 데이터베이스 설정을 구축할 수 있다. 데이터베이스 인스턴스가 기동 또는 중단될 때 리스너에게 등록 또는 등록해제 요청을 보내게 되는데 이 때 리스너가 데이터베이스를 설정할 수 있게 된다.
init.ora
설정 -> listener.ora
경로 -> ORACLE_HOME/network/admin/listener.ora
기동
- lsnrctl start
- lsnrctl restart
애플리케이션에서의 커넥션
SQL* Plus를 사용했을 때의 연결. "CONNECT scott/tiger@ora10g" 명령어를 통해 리스너와 소켓 연결을 시도합니다. 여기서 scott은 계정명 tiger는 비밀번호 ora10g는 데이터베이스 식별자입니다. 커넥션 설정 파일 명칭은 tnsname.ora 입니다. 해당 파일은리스너와의 소켓 연결에 필요한 내용을 담고 있습니다.
서버 프로세스의 생성
서버 프로세스의 생성과 소켓을 인계 받는 과정이 남아있습니다. 리스너가 SQL을 처리 할 경우 클라이언트로부터 소켓 연결이 들어왔을 때 이를 처리할 수 없기에 서버 프로세스 생성 후 해당 프로세스로 소켓을 인계하는 작업이 남아있습니다. 서버 프로세스의 생성은 가벼운 SQL 생성에 소요되는 CPU 처리시간 보다 몇십배 많은 시간을 차지합니다. 따라서 JDBC를 통한 커넥션 이후 닫아야 하는 상황이 아니라면 커넥션을 닫지 않도록 합니다.
어플리케이션의 종료 및 서버 프로세스의 종료 그리고 리스너의 종료
앱 프로세스가 모두 종료될 경우 서버프로세스도 종료합니다. 리스너의 경우 "lsnrctl" 명령어를 상태를 확인하고 종료할 수 있습니다.
접속 강제 중지 명령어
alter system kill session 'sid,serial#' immediate;
sid
- 서버 내 데이터베이스 인스턴스를 유니크하게 식별하는 식별자 역할을 수행한다.
serial#
- 데이터베이스 인스턴스 내 세션이 형성됐을 때 부여받는 식별자이다.
따라서 위 명령어는 데이터베이스 내 특정 세션의 접속을 -immedate 옵션으로 종료시키는 명령어이다.
어플리케이션 커넥션 성능을 개선하기 위해선
커넥션 풀을 만들어 서버 프로세스를 운용하면 클라이언트와 데이터베이스가 서로 연결하기 위한 과정을 다시 거치지 않아도 된다. 즉 커넥션을 캐싱한 것이라고 할 수 있다. 이를 통해 세션 연결과 종료를 위한 비용이 지불되지 않는다.
'DataBase > 그림으로 공부하는 오라클 구조' 카테고리의 다른 글
8장 오라클의 대기와 락 (0) | 2023.10.09 |
---|---|
7장 오라클의 데이터 구조 (1) | 2023.10.09 |
5장 오라클의 기동과 정지 (0) | 2023.09.20 |
4장 SQL문 분석과 공유 풀 (0) | 2023.09.20 |
3장 캐시와 공유 메모리 (0) | 2023.09.20 |