초당 10건이라면 상당히 많은 양의 자료입니다. 하루 864000건의 자료를 입력을 한다는 얘기인데 이런 경우 왠만한 서버로는 에러가 날수 밖에 없는 상황입니다. 그럴 경우 하신 것처럼 IMMEDIATE 처리를 해 주는 것이 옳으며, 만약 이것으로 처리가 잘 안될 경우 insert 전에 TABLE LOCK 을 시키고 insert 후 TABLE UNLOCK 을 시켜 주는 것도 하나의 방법 같습니다. 단 속도상의 저하는 어느 정도 각오를 하셔야 합니다. 두번째 방법으로는 명시적으로 TRANSACTION 을 열고 닫아 주는 것입니다. (하지만 이것 또한 앞의 LOCK 을 이용하는 것 만큼 안전하지는 않습니다. 그러나 CONNECTION 에러는 상당부분 줄어 들것으로 생각합니다.) 이 경우 어느 정도의 메모리를 더 요할지는 경험이 없어 장담은 못드리겠지만 상당한 메모리를 요구하게 된답니다. 마지막으로는 insert 전에 새로운 connection 을 열어 주고 insert 후에 connection 을 닫아 주는 방법이 있는 데 이것은 아마도 가장 확실한 방법일 것이라고 생각은 됩니마만 최악의 방법이 아닐까 생각됩니다. DB connection 과 close 에 아마 실행시간의 80% 정도를 소요하게 될 가능성이 큽니다. 예전에 persistent connection 과 general connection 을 가지고 둘중 어느 정도의 시간 차이가 나는지 테스트 해 본적이 있었는데 일반적으로 열고 닫는 경우에 약 70% 정도의 시간을 db connection 과 close 에 소요를 하더군요.
도움이 되셨길 바랍니다.
::송봉준 님께서 쓰시길::
>
> 이구문이 정상적으로 돌아가는지 알구 싶네요..
> EXEC SQL EXECUTE IMMEDIATE :sqlcmd;
> IMMEDIATE 구문을 쓴이유는 월이 바뀔때마다 table이 바껴야 해서 그렇게 했습니다.
>
> 글구 IMMEDIATE 구문을 안쓰고 그냥 돌렸더니 insert 가되다가
> db connect 에러가 납니다. 쓰는 속도는 초당 10 건정도의 데이타를 입력시겼고요
> 혹시 db disconnect 를 안해줘서 그런걸까요.
> disconnect 시점은 어떤때 해주는게 좋을 까요? 맘 같아서는 connect 하구
> 진행처리 하구나서 disconnect를 하고 싶은데.. 어떤 방법이 좋은건지 조언좀 부탁드립니다.
>
> 거의 마지막 단계 까지 왔는데.. 이룬....답변 부탁드립니다..그럼 꾸벅
>
> void dbINSERT_IN(readBuff, nbytes)
> char *readBuff;
> int nbytes;
> {
>
> EXEC SQL BEGIN DECLARE SECTION;
>
> char sqlcmd[500];
>
> EXEC SQL END DECLARE SECTION;
>
> char month[3];
>
> IN_INFO_DB inInfoDb;
>
> memset(&inInfoDb, 0x00, sizeof(inInfoDb));
> memset(month, 0x00, sizeof(month));
> memset(sqlcmd, 0x00, sizeof(sqlcmd));
>
> str_offset_copy_IN(&inInfoDb, readBuff, nbytes, month);
>
> EXEC SQL CONNECT TO 'test';
> sprintf(sqlcmd, "INSERT INTO In%s112(status,ktCode,pfCode,outktCode,outpfCode,acdTime,se
> rverTi
> me,ddd,telNo) VALUES(:%s, :%s, :%s, :%s, :%s, :%s, :%s, :%s, :%s)", month, inInfoDb.statusPart,
>
> inInfoDb.KTregPart, inInfoDb.chungRegPart, inInfoDb.outKTregPart, inInfoDb.outChungRegPart, inIn
>
> foDb.acdTime, inInfoDb.Servtime, inInfoDb.regionNo, inInfoDb.telNo);
>
> EXEC SQL EXECUTE IMMEDIATE :sqlcmd;
>
> EXEC SQL COMMIT;
>
> return;
> }
>
|