DataBase/그림으로 공부하는 오라클 구조

6장 커넥션과 서버 프로세시의 생성

우드의개발개발 2023. 9. 24. 11:15

어플리케이션에서 커넥션을 배워야 하는 이유

클라이언트와 오라클 데이터베이스가 하나의 서버 위에 있는 구성은 드물다. 보통은 클라이언트 프로그램과 오라클 데이터베이스 프로그램은 네트워크로 연결되어 있다. 이러한 이유로 인해 두 프로세스 간 연결을 맺어야 하는데 이 때 시간이 소요되어 해당 과정에 대해 숙지함으로써 성능을 향상시켜보자.

 

오라클 커넥션과 소켓

네트워크 안에는 여러 소켓이 있다. 소켓은 "주소 + 포트번호"로 이루어져 있다. 주소와 포트번호를 통해 소켓을 서로 구분한다. 커넥션 동작에서 주요하게 살펴보아야 하는 것은 "연락을 기다리는 프로세스 존재"와 송신측에서의 "주소 및 포트지정"해야 한다는 것이다. 오라클에서 수신을 기다리고 있는 프로세스를 리스너라고 한다. 해당 프로세스는 서버 프로세스가 아니다. 송신을 하는 쪽은 클라이언트 프로세스이다.

 

오라클 커넥션 과정

  • 리스너 기동
  • 앱의 커넥션
  • 서버 프로세스 생성

리스너 기동

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 옵션으로 종료시키는 명령어이다.

 

어플리케이션 커넥션 성능을 개선하기 위해선

커넥션 풀을 만들어 서버 프로세스를 운용하면 클라이언트와 데이터베이스가 서로 연결하기 위한 과정을 다시 거치지 않아도 된다. 즉 커넥션을 캐싱한 것이라고 할 수 있다. 이를 통해 세션 연결과 종료를 위한 비용이 지불되지 않는다.