13. Database


Database관련 고려사항

  DataBase를 사용하면서, 가장 문제가 되는 것은 overhead부분이다. 즉, 일반적으로 CGI가 DB작업을 포함하는 경우에 자주 발생되는데, 각 CGI마다 database에 접속해서 작업을 하도록 구성하게 되면, 웹이라는 상황(동시에 다수의 사용자 접근)에서는 엄청나게 많은 CGI가 동시에 실행될 수도 있다는 점이다.

  이렇게 되면, process가 과다 발생하면서( 더구나 DB까지 물고서 ) 시스템 리소스를 다 잡아먹게된다 . 사용자는 당연히 아무런 응답을 받지 못하고 계속 기다리는 상황이 발생하며, 심한 경우 웹서버가 완전히 먹통이 되서 rebooting해야 하는 경우도 있다. 주요 원인은 Database connection관리에 문제가 있기 때문이다.

  이런 현상은 일반적인 CGI개발시에 신경쓰지 않으면, 모두 발생될 가능성을 내포하게 된다. 특정 DBMS에서 제공하는 웹서버의 경우는 이러한 Database의 connection을 알아서 관리해주지만, C, perl과 같은 언어로 작성하게 되면 안된다고 봐야 한다. 일부 S/W는 이러한 기능을 추가로 제공하는 것들도 있으나, 별도의 비용을 지불해야한다.(사야한다는 말이다.)

  그러나, SSJS에서는 이러한 기능을 기본으로 제공하게 된다.(물론 그냥되는 것은 아니고, 프로그램 작성시 고려하여 작성할 수 있다는 말이다. ) 무슨 말인지 어렵다면 그냥 넘어가도 좋다. 그러나, DataBase Connection관리는 웹서버운영시에 중요한 요인이므로, 인지하고 있어야 한다. 어느날 갑자기 프로세스는 살아있는데, 응답이 없거나, 응답속도가 현저하게 저하되면, 프로세스들을 추적해야 하고, 대부분의 문제는 Database connection이라고 보면 된다.

  또한가지 고려할 사항이 있는데 실행 속도 문제이다. 모든 CGI가 실행시마다 항상 Database와 연결하는 작업을 하게 하면, 그 수행시간 만큼 지연된다는 점이다. 하나의 상황일 때는 문제가 되지 않는데, 이 역시도 동시사용자수가 많게되면, 감당하지 못할 정도롤 늘어지게 된다는 점이다.

  이러한 경우는 하나의 connection을 미리 준비해 놓고, 각 CGI가 이를 공유토록하면 Database connection관리 뿐만아니라, 실행속도 향상을 기대할 수 있게 되는 것이다. 이러한 준비작업은 어플리케이션에 단 한번만 발생해야 한다.

  어플리케이션 매니저에 관한 초기 설명에서 initial page부분이 바로 단 한번 수행해야할 페이지를 등록하는 부분이다. 또한 어플리케이션에 유일하게 존재하므로, project의 하나의 속성으로 등록해서 공유하면 된다.

  예) 다음과 같은 정의를 initial page에 포함시킨뒤에,

project.eng = new DbPool("ORACLE", "myserver1","ENG","pp","",3,true);
project.usr = new DbPool("INFOMIX","myserver2","USR","qq","",3,false);


  각 사용자의 접근에 의해 다음과 같이 처리할 수 있는 것이다.

if( request.name == "ENG" ){
    engcon = project.eng.connection("eng");
    engcon.SQLTable("select * from eng");
    engcon.release();
}


  예) 위와같이 지정된 DBMS와 ID가 아니라 개수를 알 수 없거나, 너무 많은 경우는 다이나믹하게관리해야 한다.일단, 최초에 공유정보를 생성한뒤

project.sharpool = new Object();


  각, client의 요구에 따라 다음과 같이 사용토록 한다.

if ( client.id == null )
    client.id = ssjs_generateClientID();

project.lock();
if( project.sharpool[client.id] == null ) {
    project.sharpool[client.id] = new DbPool(.....);
}
project.unlock();

var clientPool = project.sharpool[client.id];
project.lock();
if( !clientPool.connected() ){
    clientPool.connect(..);
}
project.unlock();

- Last Update : 2001.7.5 by Deadfire(http://www.deadfire.net)

LiveWire 강좌
LiveWire란?
최초예제/동작원리
실행환경 준비
컴파일 및 실행
SSJS의 기본
     - Function
     - Classes/Objects
     - 사용 Tag
     - SSJS의 처리과정
기본 함수
Client To Server
     - FORM Tag
     - URL
Server To Client
     - FORM Tag
     - Cookie
Session
Client
Project/Server
File
Database
     - Database고려사항
     - Function/예제
기타
     - Stored Procedure
     - 외부함수호출
마치며

Copyright ⓒ 1997 ~, Deadfire Program Master