본문 바로가기
프로그래밍/PC

ISAPI 기반 어플리케이션 서버의 데이터베이스 커넥션 처리

by 사악신 2012. 7. 20.

DataSnap REST Application Server 또는 SOAP Application Server 를 ISAPI 로 개발할 수 있다. 이때 해당 모듈을 데이터베이스 미들 티어로 사용할 경우라면 DB 커넥션에 대하여 몇 가지 작업을 해주어야한다.

 

1. 커넥션 관리

 

Wizard 에서 기본 생성되는 코드를 사용할 경우, 세션이나 요청별로 데이터베이스 커넥션이 발생하여 무수한 TIME_WAIT 를 발생시킨다. 물론 잦은 쿼리가 발생한다면 해당 쿼리당 커넥션 요청이 재발생하여 응답이 느려질 것이다. 다음은 데이터베이스 커넥션을 하나 생성해서 사용하는 방법이다. 물론, 풀링을 구현해서 사용하여도 좋을 것이다.

 

웹서비스로 개발되었다면, Service activation model 을 Global 로 해준다.

 

 

소스상 차이라면, DataModule 의 initialization 영역과

 

InvRegistry.RegisterInvokableClass(TSoapDataModule1, TSoapDataModule1CreateInstance);

 

아래의 procedure 가 추가된다는 점이다.

procedure TSoapDataModule1CreateInstance(out obj: TObject);
{$J+}
const
  iInstance: ISoapDataModulePost = nil;
  instance: TSoapDataModuleILP = nil;
begin
  if instance = nil then
  begin
    instance := TSoapDataModuleILP.Create(nil);
    instance.GetInterface(ISoapDataModulePost, iInstance)
  end;
  obj := instance
end;

 

가만히 보면 소스 내용이 재미있다. ^^ 컴파일러 지시자 {$J+} 에 의하여 const 로 선언된 상수를 접근할 수 있다. 마치 Singleton 의 정적멤버변수를 두고 인스턴스를 관리하는 것과 유사하다. 두번째 함수 호출부터는 instance 에 할당된 값에 의하여 if 문을 타지 않는다.

 

DataSnap REST Application 으로 개발되었다면,

 

 

 

DSServerClass 의 LifeCycle 속성을 Session 에서 Server 로 변경해준다.

 

DSServer 의 LifeCycle 속성을 Session 에서 Server 로 변경할 경우, TDSServerModule 모듈을 상속받은 데이터 모듈이 프로세스 당 한번 생성되어 유지(Session 일 경우, Session 당 데이터 모듈이 생성됨)되므로~ REST 로 메소드가 호출될 때 TSQLQuery 등을 해당 메소드 안에서 동적으로 생성하여 사용하여야한다. 그렇지 않고 데이터 모듈에 컴포넌트를 올려두고 사용하면 빠른 요청이 들어올 때 오류가 발생한다.

 

 

2. 데이터베이스 연결정보 관리

 

어플리케이션 서버가 배포된 이후 데이터베이스 연결 정보가 변경된다면 어떻게하여야 할까? 당연히 설정 파일 형태로 관리하는 것이 좋을 것이다. SQLConnection 의 LoadParamsOnConnect 를 True 로 변경한다.

 

 

 

 

그리고, 윈도우즈의 System 경로(64비트라면 SysWOW64) 아래 inetsrv 디렉토리 안, dbxconnections.ini 와 dbxdrivers.ini 를 생성한다.

 

 

 

dbxdrivers.ini 의 경우, 연결에 사용되는 정보를 제외하고 모두 삭제하여도 괜찮다.

 

 

 

[Installed Drivers]

 

Oracle=1 

 

 

[Oracle]

DriverUnit=Data.DBXOracle

DriverPackageLoader=TDBXDynalinkDriverLoader,DBXCommonDriver160.bpl

DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxCommonDriver,Version=16.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b

MetaDataPackageLoader=TDBXOracleMetaDataCommandFactory,DbxOracleDriver160.bpl

MetaDataAssemblyLoader=Borland.Data.TDBXOracleMetaDataCommandFactory,Borland.Data.DbxOracleDriver,Version=16.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b

GetDriverFunc=getSQLDriverORACLE

LibraryName=dbxora.dll

LibraryNameOsx=libsqlora.dylib

VendorLib=oci.dll

VendorLibWin64=oci.dll

VendorLibOsx=libociei.dylib

DataBase=어쩌구

User_Name=어쩌구

Password=어쩌구

BlobSize=-1

ErrorResourceFile=

LocaleCode=0000

IsolationLevel=ReadCommitted

RowsetSize=20

OS Authentication=False

Multiple Transaction=False

Trim Char=False

Decimal Separator=.

 

[Oracle TransIsolation]

DirtyRead=0

ReadCommited=1

RepeatableRead=2

 

 

 

 

dbxconnections.ini 의 경우도 마찬가지이며 이때 SQLConnection 에 ConnectionName 과 Drive 에 지정한 값들과 섹션명이 일치하여야한다.

 

 

[OracleConnection]

;DelegateConnection=DBXTraceConnection

DriverName=Oracle

DataBase=어쩌구

User_Name=어쩌구

Password=어쩌구

RowsetSize=20

BlobSize=-1

ErrorResourceFile=

LocaleCode=0000

IsolationLevel=ReadCommitted

OS Authentication=False

Multiple Transaction=False

Trim Char=False

Decimal Separator=.

 

 

 

설정정보가 변경되었을 경우, IIS 의 어플리케이션 풀을 재시동하여야한다.

반응형

댓글