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 의 어플리케이션 풀을 재시동하여야한다.
'프로그래밍 > PC' 카테고리의 다른 글
XE2 에서 Custom VCL Style 을 리소스로 포함하여 사용하기 (1) | 2012.08.09 |
---|---|
FieldByName 사용팁 (0) | 2012.07.25 |
Delphi XE2 에서 DataSnap REST Application Client (0) | 2012.07.13 |
dbExpress MySQL 5.1 한글 테이블명 사용 (0) | 2012.06.26 |
Delphi XE2 에서 DataSnap REST Application Cross Domain 처리 (0) | 2012.06.20 |
댓글