| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- http
- 컨트롤러
- oracle
- wsdl
- Docker
- HTML
- 안드로이드 스튜디오
- ibatis
- equals
- 영상편집
- 삼성증권
- cmd
- 키보드
- 프로세스
- API
- MySQL
- letterspacing
- 오블완
- Linux
- java
- 티스토리챌린지
- 스레드
- START WITH
- 스레드 덤프
- 톰캣
- MariaDB
- integer
- Tomcat
- JDBC
- Database
- Today
- Total
블로그 이름
[ORACLE] DB 동작과정 이해하기 본문
애플리케이션에서 오라클로의 커넥션 과정 이해가 필요한 이유는 애플리케이션에서 접속하는 것을 최적화하는 것만으로도 DB의 성능을 끌어올릴 수 있기 때문이다. 그리고 애플리케이션에서 피해야 하는 코딩 방식을 이해하는데에도 도움이 된다.
오라클은 애플리케이션 서버를 사용한 시스템이나 클라이언트/서버 형태의 시스템에서도 많이 사용된다. 즉 DB와 DB를 사용하는 애플리케이션이 같은 서버에 있는 경우는 드물며 네트워크를 통해 통신하는 경우가 많다. 그러므로 접속 장애가 발생한다.
오라클은 TCP/IP의 소켓을 네트워크 통신 수단으로 사용하고 있다. 그래서 소켓 동작을 알아야 한다.
어플리케이션과 서버가 소켓을 통해 동작한다.
소켓은 주소와 포트번호의 조합으로 식별할 수 있다. 어플리케이션의 프로세스와 오라클의 프로세스가 존재한다.
오라클의 프로세스는 특정 포트 번호로 연락이 오는 것을 기다리고 있고 (LISTEN 상태), 클라이언트 측에서 송신 시 오라클의 프로세스가 응답하며 이후 커넥션이 확립된다. 오라클에서 수신을 기다리는 프로세스를 리스너(listerner) 라고 부른다.
1. 데이터베이스 서버에서 listen.ora에서 확인하여 listen을 시작한다. (listener.ora는 리스너의 설정 파일이다)
2. 애플리케이션 서버에서 tnsnames.ora 파일을 확인하여 리스너의 주소나 포트번호, 서비스 이름 등을 확인한다. 확인한 내용을 사용하여 커넥션을 확립한다.
3. 소켓이 확립되면 데이터베이스 서버는 프로세스를 생성한다.
리스너 설정 후, lsnrctl이라는 도구를 사용하여 리스너를 기동한다. listener.ora 파일의 설정을 읽거나, DB가 자동으로 등록한다.
데이터베이스에 연결 시 필요한 정보를 오라클 클라이언트에 전달해야하며, 그 정보를 '커넥션 디스크립터'라고 부른다.
커넥션 디스크립터 안에는 주소, 포트, 서비스 이름 같은 정보가 포함되어있다.
tnsnames.ora에 커넥션 디스크립터를 작성해놓고 커넥션 식별자를 커넥션 디스크립터마다 붙인다. 그래서 연결 시에는 해당 식별자를 전달하기만 하면 된다.
일반적으로 오라클 클라이언트는 tnsnames.ora의 커넥션 디스크립터 정보를 사용하여 리스너와 클라이언트 사이에 소켓을 생성하고, 리스너에게 해당 데이터베이스와 통신하고 싶다고 연락한다.
tnsnames.ora 구성
ORA18C : 커넥션 식별자, 임의의 이름 설정 가능하며 net service name이라고 부른다.
DESCRIPTION : 커넥션 디스크립터
ADDRESS : 소켓을 생성하는데 필요한 정보
CONNECT_DATA : 리스너에게 전달하기 위한 정보
마지막으로 서버 프로세스를 생성하고 소켓을 인계받는다. 소켓을 생성하면 리스너가 그대로 SQL 처리를 해도 될 것 같지만 한번 SQL 처리를 시작하면 요청 SQL 처리하느라 다른 처리를 할 수 없게 되므로 전답 영업 담당자인 서버 프로세스를 생성하여 SQL 처리를 인계한다.
서버 프로세스 생성과정은 다음과 같다.
1. OS 상에 프로세스를 생성한다 (프로세스 생성은 처리가 무겁다)
2. 서버 프로세스가 사용할 수 있는 공유 메모리를 확보한다.
3. 서버 프로세스용 전용 메모리(PGA)도 확보
4. 그 외에 데이터베이스 내부의 처리도 여러가지 남아있다.
서버 프로세스를 한번 생성하는데 가벼운 SQL문 처리 시간보다 몇배~몇십배 많은 시간을 사용한다. 따라서 개발 시 서버 프로세스 생성이 필요한 물리 커넥션 생성 및 종료를 반복하는 형태는 지양해야한다.
리스너는 서버 프로세스 생성이 끝나면 소켓을 서버 프로세스에 인계한다. 리스너가 인계한 후부터 서버 프로세스와 오라클 클라이언트는 직접 송수신하므로 리스너는 자유로워진다.
커넥션을 맺는 것과 서버 프로세스 생성은 오라클에게 무거운 작업이다. 이런 작업을 병렬 처리를 가능케 하며 높은 처리량을 실현하는 것이 가능할까
수십, 수백 개의 서버 프로세스가 가동 중인 시스템도 드물진 않지만 대부분의 프로세스는 가동시간 중 일부만 SQL을 처리한다. 또한 클라이언트와 일대일로 대응하여 서버 프로세스가 존재한다면 서버 프로세스를 줄이는건 어렵다.
서버 프로세스 하나가 여러개의 클라이언트를 담당하게 하는 방법이 있다. 하지만 문제점이 있다. 서버 프로세스는 한번 SQL 처리를 시작하면 끝날때까지 다른 작업을 안한다. 서버 프로세스 하나서 많은 클라이언트를 담당 시 요청을 동시에 받으면 대처가 어렵다.
때문에 서버 프로세스를 여러개로 여러 클라이언트의 SQL을 처리할 수 잇도록 한다면 (서버 프로세스 몇개를 미리 연결해두고, 여러 애플리케이션이 사용하고 싶을 때에만 풀을 사용한다) 대부분이 대기상태인 서버 프로세스의 가동률을 높일 수 있다. 이러한 구성을 '커넥션 풀' 이라고 한다.
오늘은 oracle DB의 리스너 및 커넥션이 동작하는 구조를 알아보았다.
'개발 > Database' 카테고리의 다른 글
| [ORACLE] SID와 Service Name 차이점 (0) | 2025.02.04 |
|---|---|
| [ORACLE] SID와 Service Name의 차이 (0) | 2025.02.04 |
| [ORACLE] ORA-02264: name already used by an existing constraint (0) | 2024.12.24 |
| [Database] database에서 지원하는 jdbc 지원 버전 확인하기 (1) | 2024.12.13 |
| [MySQL] last_insert_id() (0) | 2024.12.01 |