제3장 TCache API

본 장에서는 TCache API의 사용법과 예제에 대해서 설명한다.

3.1. 개요

다음은 TCache API 목록에 대한 설명이다.

API설명
pfmTCacheGetTCache Shared Memory에 Item값을 설정한다.
pfmTCacheGetAllTCache가 관리하는 cache_name 테이블에 존재하는 모든 레코드 데이터를 mem 버퍼에 size만큼 읽어온다.
pfmTCachePutTCache가 관리하는 메모리에 데이터를 저장하기 위한 API이다.
pfmTCacheInvalidateTCache가 관리하는 메모리를 초기화하기 위한 API로 cache_name 테이블 내의 Key에 해당하는 레코드 데이터를 초기화한다.
pfmTCacheInvalidateAllTCache가 관리하는 메모리를 초기화하기 위한 API로 cache_name 테이블 내의 모든 데이터를 초기화한다.
pfmTCacheItemProFrame 전용 API로 pfmTCacheGet과 pfmTCachePut이 하나의 기능으로 구현된 부분이다.

3.2. pfmTCacheGet

TCache Shared Memory에 Item값을 설정한다. TCache에서 데이터를 읽어올 때 READ Lock을 획득해야 한다. No-Wait 모드에서는 한 번의 Lock의 획득 시도를 실패하면 바로 오류를 반환하는 반면 Wait 모드에서는 일정 횟수의 Lock 획득을 시도한 후 실패하는 경우 오류를 반환한다. TCache의 전반적인 수행 능력의 향상을 위하여 기본적으로 flag는 0으로 설정한다.

사용 예제

캐시 이름이 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.3. pfmTCacheGetAll

TCache가 관리하는 cache_name 테이블에 존재하는 모든 레코드 데이터를 mem 버퍼에 size 만큼 읽어온다.

3.4. pfmTCachePut

TCache가 관리하는 메모리에 데이터를 저장하기 위한 API이다. cache_name 테이블에서 Key 값에 해당하는 레코드 데이터를 mem 버퍼에 size 만큼 읽어온다.

사용 예제

“3.2. pfmTCacheGet”의 예제를 참조한다.

3.5. pfmTCacheInvalidate

TCache가 관리하는 메모리를 초기화하기 위한 API로 cache_name 테이블 내의 Key에 해당하는 레코드 데이터를 초기화한다.

사용 예제

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

3.6. pfmTCacheInvalidateAll

TCache가 관리하는 메모리를 초기화하기 위한 API로 cache_name 테이블 내의 모든 데이터를 초기화한다.

3.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"로 설정한다.