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); }
-