pro*c로 select한 데이터를 다른 함수에 넘기는 방법...
글쓴이: cjy1126 / 작성시간: 목, 2005/03/03 - 1:52오후
pro*c로 db에 있는 사원의 출근 데이터를 모니터 프로그램에 보내야합니다.
사원의 출근 구조체는 아래와 같습니다.
struct chulgun { int sabun; char startDay[DAYSIZE + 1]; /* 출근날짜 */ char startTime[TIMESIZE + 1]; /* 출근시간 */ char endDay[DAYSIZE + 1]; char endTime[TIMESIZE + 1]; };
사원의 출근기간으로 select하면 몇개의 데이터가 나올지 모르니 동적할당을 해야할거라 생각합니다.
이 동적할당 방법에 대한 질문입니다.
1. select로 결과의 수(count*)를 얻는다. 전체의 크기(구조체 * 결과의 수)만큼 동적할당한다. 동적할당된 메모리에 select(fetch)를 저장한다.
2. select(fetch)를 한다. 검색된 결과가 NOT FOUND가 아니라면 1개의 구조체만큼 동적할당한다. NOT FOUNT까지 반복한다.
1번은 쿼리를 2번해야하나 메모리 할당을 한번만 합니다. 동적할당된 데이터를 배열처럼 사용가능합니다.
2번은 쿼리는 한번하나 검색된 결과 한개마다 한번씩 동적할당을 합니다. 동적할당된 자료는 링크드 리스트로 유지되야 합니다.
제 생각에는 1번이 좋을듯하나... 확실히 알고싶어 질문을 올립니다.
이보다 좋은 방법이 있으면 조언 부탁드립니다.
Forums:
1번 추천.
1번 추천.
저 같은 경우는 2번을 사용합니다. ^^데이터 건수가 많지 않으시
저 같은 경우는 2번을 사용합니다. ^^
데이터 건수가 많지 않으시면 1번도 괜찮을듯
♣♣♣♣♣♣ 폼나게 살자. 아님 말고~ ♣♣♣♣♣
저라면, 당연히 2번. 1번은 두번의 selection 중간에 데이타가
저라면, 당연히 2번. 1번은 두번의 selection 중간에 데이타가 추가나 삭제된 경우 미리 지정된 메모리의 크기가 문제가 됨.
----
I paint objects as I think them, not as I see them.
atie's minipage
아~ 제가 설명을 제대로 안썼네요.
select한 데이터를 넘겨받은 후에 소켓에 한번 쏴주고 더이상 사용안하기 때문에 free 합니다.
즉, 한번 send해주면 끝이죠.
fetch할때마다 send로 보내주라는데, db를 쿼리하는 함수와 socket 함수를 같이 쓰는게 꺼려지더라고요.
proc 컴파일때 에러나고 그래서 db와 socket을 찢어 논 상태거든요.
Re: 아~ 제가 설명을 제대로 안썼네요.
1번도 2번도아니고.. 구조체는 하나만 사용해서 그때그때 넘겨야겠죠..
오류가 나면 오류를 잡거나.. 따로컴파일한다해도 문제는 없을듯하군요..
----------------------------------------------------------------------------
제가 생각하기에도 fetch할때마다 send로 보내주는게 가장 좋은 방법
제가 생각하기에도 fetch할때마다 send로 보내주는게 가장 좋은 방법인 것 같습니다..
그러면 굳이 동적으로 메모리를 할당하지 않아도 되는 장점이 있고,
서로 정해놓은 통신 규약만 잘 지킨다면 실시간으로 Update, Intert되는 자료도 조회하여 전송할 수 있을 것입니다..
제가 보기에 DB 쿼리 기능과 socket기능을 같이 사용한다고 해도 문제가 발생하시는 않는다고 알고 있습니다..
컴파일 시에 에러가 나는 것은 컴파일 옵션에 라이브러리나 헤더가 포함되지 않아서 그런 것이 아닐까 추측이 됩니다.
또, 계속 컴파일 에러가 발생한다면 위의 분이 말씀하신 대로 해당 쿼리기능과 소켓기능을 모듈화해서 따로 컴파일해서 링크해서 사용하면 크게 문제 없을 것이라고 생각합니다..
이상 제 나름대로의 해결책이었습니다..^^*
Positive Energy
fetch한 것은 소켓에 쏴주고 free하신다고 하셨는데,SELECT
fetch한 것은 소켓에 쏴주고 free하신다고 하셨는데,
SELECT의 결과로 100,000 건이 있다면 한번에 쏘는 것인지
100,000 번 쏘는 것인지 쓰신 글만으로는 확실치 않네요.
(처음 글에서는 후자인 듯 했으나 그 후의 글에서 전자인 듯 한 느낌도 드네요.)
1. 한번에 한 레코드만 쏘는 것이면,
당연히 메모리 할당이고 할 것도 없이 struct 변수 하나로 계속 이용하면 되겠고요.
2. 한번에 다 보내야 하는 경우는,
레코드 갯수가 메모리로 로드할 수 있는 적정한 수라는 것이 보장된다면
2번의 알고리즘을 선형적으로 증가시키기 보다는 지수적으로 증가시키면서 사용하시는게 나을 것입니다.
즉, 맨 처음에는 크기가 1, 다음에는 2, 그 다음에는 4, 8, 16, 32 등으로요.
어플리케이션의 성격을 안다면 초기 크기를 256 이나 1024 등으로 설정하시면 realloc 부담을 줄일 수 있을 것이고,
여기에 메모리 재활용 로직과 과다 할당 메모리 회수 로직을 추가하신 다면
메모리 할당/재할당을 거의 수행하지 않으실 수도 있고, 메모리 사용도 일정정도로 제한할 수 있을 것입니다.
그리고, array 처리를 통해서 DB접근 효율을 높이실 수 있을 것입니다.
이 경우에는 struct 리스트의 크기는 array 크기나 그 배수로
하시는 것이 처리하기 편리하실 것이고요.
댓글 달기