TCache API
본 장에서는 TCache API의 사용법과 예제에 대해서 설명한다.
1. 개요
다음은 TCache API 목록에 대한 설명이다.
| API | 설명 |
|---|---|
TCache Shared Memory에 Item값을 설정한다. |
|
TCache가 관리하는 cache_name 테이블에 존재하는 모든 레코드 데이터를 mem 버퍼에 size만큼 읽어온다. |
|
TCache가 관리하는 메모리에 데이터를 저장하기 위한 API이다. |
|
TCache가 관리하는 메모리를 초기화하기 위한 API로 cache_name 테이블 내의 Key에 해당하는 레코드 데이터를 초기화한다. |
|
TCache가 관리하는 메모리를 초기화하기 위한 API로 cache_name 테이블 내의 모든 데이터를 초기화한다. |
|
ProFrame 전용 API로 pfmTCacheGet과 pfmTCachePut이 하나의 기능으로 구현된 부분이다. |
2. pfmTCacheGet
TCache Shared Memory에 Item값을 설정한다. TCache에서 데이터를 읽어올 때 READ Lock을 획득해야 한다. No-Wait 모드에서는 한 번의 Lock의 획득 시도를 실패하면 바로 오류를 반환하는 반면 Wait 모드에서는 일정 횟수의 Lock 획득을 시도한 후 실패하는 경우 오류를 반환한다. TCache의 전반적인 수행 능력의 향상을 위하여 기본적으로 flag는 0으로 설정한다.
-
프로토타입
long pfmTCacheGet( const char* cacheName, const char* key, void* mem, const unsigned long size, long flags ) -
파라미터
파라미터 설명 cacheName
pfmtcache.cfg에서 정의한 “CACHE_NAME”이다.
key
입력 데이터의 앞부분부터 pfmtcache.cfg 파일에 기록된 “SIZE_KEY” 길이만큼의 데이터이다.
mem
저장된 데이터를 받아올 임시 버퍼이다.
size
데이터를 받아올 버퍼의 크기를 설정한다.
flags
Blocking Mode를 결정하기 위한 flags이다.
-
0 : No-Wait(기본값)
-
1 : Wait
-
-
반환값
성공하는 경우에는 0을 리턴하고, 실패하는 경우에는 negative 값이 리턴된다. 에러 코드에 대한 자세한 내용은 에러 코드를 참고한다.
-
예제
rc = pfmTCacheGet("PFM_SVC", data, get_data, sizeof(get_data), 0); if(rc != 0 ) { printf("PFM_SVC pfmTCacheGet() fail!!\n"); }else{ printf("PFM_SVC [%s] Get success!!\n", get_data); } -
주의사항
데이터를 저장할 버퍼인 mem의 크기가 TCache에 존재하는 데이터보다 작을 경우 에러를 반환하지 않고 4번째 인자인 size만큼의 데이터를 받아오며, 정상 리턴하게 된다.
사용 예제
캐시 이름이 PFM_SVC인 경우 “PFM4 ORDERBOOK_SMPF0001_S0010”라는 Key를 가진 데이터를 Get해오는 예제이다.
캐시 Key에 해당하는 데이터가 존재하지 않을 경우 DBIO인 PfmSvcSel000를 이용하여 DB select를 수행하여 가져온 데이터를 PFM_SVC 캐시에 Put해준다.
struct PfmSvcSel000In {
char projectId[LEN_PFMSVCSEL000IN_PROJECTID + 1];
char instNo [LEN_PFMSVCSEL000IN_INSTNO + 1];
char txCode [LEN_PFMSVCSEL000IN_TXCODE + 1];
};
typedef struct PfmSvcSel000In PfmSvcSel000In;
struct PfmSvcSel000Out {
char instNo[LEN_PFMSVCSEL000OUT_INSTNO + 1];
char txCode[LEN_PFMSVCSEL000OUT_TXCODE + 1];
char applySdate[LEN_PFMSVCSEL000OUT_APPLYSDATE + 1];
char applyStime[LEN_PFMSVCSEL000OUT_APPLYSTIME + 1];
char applyEdate[LEN_PFMSVCSEL000OUT_APPLYEDATE + 1];
char applyEtime[LEN_PFMSVCSEL000OUT_APPLYETIME + 1];
char stopFlag[LEN_PFMSVCSEL000OUT_STOPFLAG + 1];
char stopSdate[LEN_PFMSVCSEL000OUT_STOPSDATE + 1];
char stopStime[LEN_PFMSVCSEL000OUT_STOPSTIME + 1];
char stopEdate[LEN_PFMSVCSEL000OUT_STOPEDATE + 1];
char stopEtime[LEN_PFMSVCSEL000OUT_STOPETIME + 1];
char calleeName[LEN_PFMSVCSEL000OUT_CALLEENAME + 1];
long staType;
char txName[LEN_PFMSVCSEL000OUT_TXNAME + 1];
char svcName[LEN_PFMSVCSEL000OUT_SVCNAME + 1];
char dummySvcName[LEN_PFMSVCSEL000OUT_DUMMYSVCNAME + 1];
char inStructName[LEN_PFMSVCSEL000OUT_INSTRUCTNAME + 1];
char inMapName[LEN_PFMSVCSEL000OUT_INMAPNAME + 1];
char outStructName[LEN_PFMSVCSEL000OUT_OUTSTRUCTNAME + 1];
char outMapName[LEN_PFMSVCSEL000OUT_OUTMAPNAME + 1];
char logType[LEN_PFMSVCSEL000OUT_LOGTYPE + 1];
long apLogProcess;
long errorLogProcess;
char traceLogLevel[LEN_PFMSVCSEL000OUT_TRACELOGLEVEL + 1];
char debugLogLevel[LEN_PFMSVCSEL000OUT_DEBUGLOGLEVEL + 1];
char traceLevel[LEN_PFMSVCSEL000OUT_TRACELEVEL + 1];
long threshold;
long sqlTraceLevel;
};
typedef struct PfmSvcSel000Out PfmSvcSel000Out;
PfmSvcSel000In SVCInput;
PfmSvcSel000Out SVCOutput;
memset(&SVCInput, 0x00, sizeof(PfmSvcSel000In));
memset(&SVCOutput, 0x00, sizeof(PfmSvcSel000Out));
memcpy(SVCInput.projectId, "MDS", 6);
memcpy(SVCInput.tx_code, "SPFM0008A001", 24);
memcpy(SVCInput.inst_no, "PFM", 3);
rc = pfmTCacheGet("PFM_SVC", &SVCInput, &SVCOutput,
(unsigned int)sizeof(PfmSvcSel000Out), 0);
if( rc != RC_NRM){ /* RC_NRM = 0L : 정상일때 */
PFM_TRYNJ( pfmDbioSelect("PFM_SVC_PS0001Output ", &SVCInput, &SVCOutput, NULL,
PFMDBIO_NOLOCK));
if( rc != RC_NRM){
if( rc == PDB_NOTFOUND) /* 1403L :DB에서 찾지 못했을때 발생 */
PFM_ERR("SvcParamDataNotFound projectId[%s], tx_code[%s], inst_no[%s]",
SVCInput.projectId, SVCInput.tx_code, SVCInput.inst_no);
else
PFM_ERR("SvcParamTableQueryFail pfmDbioGetErrorNo[%ld],
pfmDbioGetErrorString[%s]",
pfmDbioGetErrorNo(), pfmDbioGetErrorString());
}
else{
rc = pfmTCachePut("PFM_SVC", &SVCOutput, (unsigned int)sizeof(PfmSvcSel000Out), 0);
if( rc != RC_NRM) /* RC_NRM = 0L : 정상일때 */
PFM_DBG("pfmTCachePutError[%s] rc[%ld]", "PFM_SVC", rc);
else
PFM_DBG("pfmTCachePutSuccess [%s]", "PFM_SVC");
}
}
else{
PFM_DBG("pfmTCacheHitSuccess [%s]", "PFM_SVC");
}
3. pfmTCacheGetAll
TCache가 관리하는 cache_name 테이블에 존재하는 모든 레코드 데이터를 mem 버퍼에 size 만큼 읽어온다.
-
프로토타입
long pfmTCacheGetAll( const char* cacheName, void* mem, unsigned long size, long flags ) -
파라미터
파라미터 설명 cacheName
pfmtcache.cfg에서 정의한 “CACHE_NAME”를 설정한다.
mem
저장된 데이터를 받아올 임시 버퍼이다.
size
데이터를 받아올 버퍼의 크기를 설정한다.
flags
-
0 : No-Wait(기본값)
-
1 : Wait
-
-
출력 Layout
저장된 레코드의 개수(unsigned int : 8byte), record1 크기(unsigned int : 8byte), record 1 데이터, record2 크기(unsigned int : 8byte), record2 데이터, ...
-
반환값
성공하는 경우에는 0을 리턴하고, 실패하는 경우에는 negative 값이 리턴된다. 에러 코드에 대한 자세한 내용은 에러 코드를 참고한다.
-
예제
char * get_data; char * record_count; get_data = (char*)malloc(10000); rc = pfmTCacheGetAll("PFM_SVC", get_data, 10000, 0); if(rc != 0 ) { printf("PFM_SVC pfmTCacheGetAll() fail!!\n"); }else{ printf("PFM_SVC GetAll success!!\n"); memcpy(&record_count, get_data, sizeof(unsigned int)); printf("PFM_SVC Get Record Count[%ld]\n", record_count)); } -
주의사항
데이터를 받아올 버퍼가 TCache에 저장된 데이터보다 작을 경우에 에러를 리턴하지 않고 세 번째 인자의 크기만큼 데이터를 받아오며 정상 처리된다. pfmTCacheGetAllItems() API는 Block Mode이므로 pfmTCacheInvalidate()와 같은 Block Mode로 동작하는 API가 자주 호출되는 환경에서는 속도의 저하를 초래할 수 있다.
4. pfmTCachePut
TCache가 관리하는 메모리에 데이터를 저장하기 위한 API이다. cache_name 테이블에서 Key 값에 해당하는 레코드 데이터를 mem 버퍼에 size 만큼 읽어온다.
-
프로토타입
long pfmTCachePut( const char* cacheName, void* mem, const unsigned long size, long flags ) -
파라미터
파라미터 설명 cacheName
pfmtcache.cfg에서 정의한 “CACHE_NAME”를 설정한다.
mem
저장된 데이터를 받아올 임시 버퍼이다.
size
데이터를 받아올 버퍼의 크기를 설정한다.
flags
-
0 : No-Wait(기본값)
-
1 : Wait
-
-
반환값
성공하는 경우에는 0을 리턴하고, 실패하는 경우에는 negative 값이 리턴된다. 에러 코드에 대한 자세한 내용은 에러 코드를 참고한다.
-
예제
rc = pfmTCachePut("PFM_SVC", set_data, sizeof(set_data), 0); if(rc != 0 ) { printf("PFM_SVC pfmTCachePut() fail!!\n"); }else{ printf("PFM_SVC [%s] Put success!!\n", set_data); } -
주의사항
저장되는 데이터의 첫 번째 Byte로부터 pfmtcache.cfg에서 “SIZE_KEY”로 설정한 값 만큼의 정보를 TCache의 Key로 이용하므로 Key에 관한 정보가 저장할 데이터의 제일 앞에 위치하도록 한다.
사용 예제
pfmTCacheGet의 예제를 참조한다.
5. pfmTCacheInvalidate
TCache가 관리하는 메모리를 초기화하기 위한 API로 cache_name 테이블 내의 Key에 해당하는 레코드 데이터를 초기화한다.
-
프로토타입
long pfmTCacheInvalidate( const char* cacheName, const char* key, long flags )
-
파라미터
파라미터 설명 * cacheName
pfmtcache.cfg에서 정의한 “CACHE_NAME”를 설정한다.
* key
입력 데이터의 앞 부분부터 pfmtcache.cfg 파일에 기록된 “SIZE_KEY”길이만큼의 데이터이다.
size
데이터를 받아올 버퍼의 크기를 설정한다.
flags
invalidate될 때 내부적으로 사용하는 flag로써 기본적으로 “0”으로 설정한다.
-
반환값
성공하는 경우에는 0을 리턴하고, 실패하는 경우에는 negative 값이 리턴된다. 에러 코드에 대한 자세한 내용은 에러 코드를 참고한다.
-
예제
rc = pfmTCacheInvalidate("PFM_SVC", inv_data, sizeof(inv_data), 0); if(rc != 0 ) { printf("PFM_SVC pfmTCacheInvalidate() fail!!\n"); }else{ printf("PFM_SVC [%s] Invalidate success!!\n", inv_data); }
사용 예제
“tb_mti700”이라는 DBIO를 업데이트한 후 동기화를 위해 TCache를 invalidate하는 예제이다.
tb_mti700_pu999In mti700_pu999In;
bzero(&mti700_pu999In, sizeof(tb_mti700_pu999In));
mti700_pu999In.isu_id = 20231;
strncpy(mti700_pu999In.isu_cd, "ks00000000", sizeof(mti700_pu999In.isu_cd));
rc = pfmDbioAmend("tb_mti700_pu999", &mti700_pu999In, NULL, PFMDBIO_NOLOCK);
if(rc != RC_NRM) {
PFM_ERR("TRE0001020", "업데이트에 실패했습니다.");
}
else {
PFM_DBG("========TCache invalidate==========");
PFM_TRYNJ(pfmTCacheInvalidate("TB_MTI700", &mti700_ps999In, 0));
if(rc != RC_NRM) {
if(rc == RC_NFD) {
/* TCache 에 캐쉬 데이타가 없는 경우 */
PFM_DBG("pfmTCacheInvalidate NOT Found");
}
else {
/* TCache invalidate 에러 처리 */
PFM_ERR("TRE0001021", "pfmTCacheInvalidate ERROR! rc[%ld]", rc);
return RC_ERR;
}
} else {
PFM_DBG("pfmTCacheInvalidate SUCCESS");
}
}
6. pfmTCacheInvalidateAll
TCache가 관리하는 메모리를 초기화하기 위한 API로 cache_name 테이블 내의 모든 데이터를 초기화한다.
-
프로토타입
long pfmTCacheInvalidateAll( const char* cacheName, long flags )
-
파라미터
파라미터 설명 cacheName
pfmtcache.cfg에서 정의한 “CACHE_NAME”를 설정한다.
flags
invalidate될 때 내부적으로 사용하는 flag로써 기본적으로 “0”으로 설정한다.
-
반환값
성공하는 경우에는 0을 리턴하고, 실패하는 경우에는 negative 값이 리턴된다. 에러 코드에 대한 자세한 내용은 에러 코드를 참고한다.
-
예제
rc = pfmTCacheInvalidateAll("PFM_SVC", 0); if(rc != 0 ) { printf("PFM_SVC pfmTCacheInvalidateAll() fail!!\n"); }else{ printf("PFM_SVC Invalidate All success!!\n"); }
7. pfmTCacheItem
ProFrame 전용 API로 pfmTCacheGet과 pfmTCachePut이 하나의 기능으로 구현된 부분이다.
pfmTCacheItem과 연관된 $TCACHECONF는 CALLBACK_NAME 파라미터 값이다. 설정된 CALLBACK_NAME이 GET_SVC_BM("CALLBACK_NAME=GET_PFM_SVC")인 경우를 예를 든다면, pfmTCacheGet했을 때 찾지 못했을 경우 GET_PFM_SVC BM에서에서 데이터를 가져와 pfmTCachePut하는 로직을 처리한다. 이때 DlCall되는 라이브러리는 libGET_PFM_SVC.so.*가 호출된다. BM은 "_WS"가 붙지 않은 라이브러리인 RI 영역의 BM 라이브러리만 Dlcall된다. 따라서 RI/WS 환경일 때에는 RI 영역의 BM만 호출된다. Tmax 6에서는 따로 libtdlcall을 링크하지 않아도 된다.
내부적인 처리 구조로 인해 IN/OUT을 가지는 ProFrame C의 BusinessModule로 제한한다. 해당 BM의 Input 구조체의 size는 SIZE_KEY와 대응되며, Output 구조체의 size는 SIZE_REC와 대응된다. CALLBACK_NAME은 BM의 물리명인 "CALLBACK_NAME=GET_PFM_SVC"로 설정한다.
-
프로토타입
long pfmTCacheItem( const char* cacheName, const char* key, void* mem, const unsigned long size, long flags ); -
파라미터
파라미터 설명 cacheName
pfmtcache.cfg에서 정의한 “CACHE_NAME”를 설정한다.
key
입력 데이터의 앞부분부터 pfmtcache.cfg 파일에 기록된 “SIZE_KEY” 길이만큼의 데이터이다.
mem
저장된 데이터를 받아올 임시 버퍼이다.
size
데이터를 받아올 버퍼의 크기를 설정한다.
flags
Blocking Mode를 결정하기 위한 flags이다.
-
0 : No-Wait(기본값)
-
1 : Wait
-
-
반환값
성공하는 경우 0를 반환하고, 실패하는 경우에는 negative 값이 반환된다.
-
예제
-
pfmtcache.cfg 설정값
# cache for PFM_SVC CACHE_NAME=PFM_SVC SIZE_MEM=6553 # the total cache memory size in kilo-bytes SIZE_HASH=1024 # the number of hash key (MAX=6553) SIZE_KEY=30 # the number of digits of the index column SIZE_REC=2048 # the size of a single record in bytes INV_TIMEOUT=10 # invalidation timeout in sec CALLBACK_NAME=GET_SVC_PARAM # libGET_SVC_PARAM.so
-
Source Code
rc = pfmTCacheItem("PFM_SVC", data, get_data, sizeof(get_data), 0); if(rc != 0 ) { printf("PFM_SVC pfmTCacheItem() fail!!\n"); }else{ printf("PFM_SVC [%s] Get success!!\n", get_data); }
-