pro*c로 select한 데이터를 다른 함수에 넘기는 방법...

cjy1126의 이미지

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번이 좋을듯하나... 확실히 알고싶어 질문을 올립니다.

이보다 좋은 방법이 있으면 조언 부탁드립니다.

익명 사용자의 이미지

1번 추천.

cnovice의 이미지

저 같은 경우는 2번을 사용합니다. ^^

데이터 건수가 많지 않으시면 1번도 괜찮을듯

♣♣♣♣♣♣ 폼나게 살자. 아님 말고~ ♣♣♣♣♣

atie의 이미지

저라면, 당연히 2번. 1번은 두번의 selection 중간에 데이타가 추가나 삭제된 경우 미리 지정된 메모리의 크기가 문제가 됨.

----
I paint objects as I think them, not as I see them.
atie's minipage

cjy1126의 이미지

select한 데이터를 넘겨받은 후에 소켓에 한번 쏴주고 더이상 사용안하기 때문에 free 합니다.

즉, 한번 send해주면 끝이죠.

fetch할때마다 send로 보내주라는데, db를 쿼리하는 함수와 socket 함수를 같이 쓰는게 꺼려지더라고요.

proc 컴파일때 에러나고 그래서 db와 socket을 찢어 논 상태거든요.

ㅡ,.ㅡ;;의 이미지

cjy1126 wrote:
select한 데이터를 넘겨받은 후에 소켓에 한번 쏴주고 더이상 사용안하기 때문에 free 합니다.

즉, 한번 send해주면 끝이죠.

fetch할때마다 send로 보내주라는데, db를 쿼리하는 함수와 socket 함수를 같이 쓰는게 꺼려지더라고요.

proc 컴파일때 에러나고 그래서 db와 socket을 찢어 논 상태거든요.

1번도 2번도아니고.. 구조체는 하나만 사용해서 그때그때 넘겨야겠죠..
오류가 나면 오류를 잡거나.. 따로컴파일한다해도 문제는 없을듯하군요..


----------------------------------------------------------------------------

cry703의 이미지

제가 생각하기에도 fetch할때마다 send로 보내주는게 가장 좋은 방법인 것 같습니다..

그러면 굳이 동적으로 메모리를 할당하지 않아도 되는 장점이 있고,

서로 정해놓은 통신 규약만 잘 지킨다면 실시간으로 Update, Intert되는 자료도 조회하여 전송할 수 있을 것입니다..

제가 보기에 DB 쿼리 기능과 socket기능을 같이 사용한다고 해도 문제가 발생하시는 않는다고 알고 있습니다..

컴파일 시에 에러가 나는 것은 컴파일 옵션에 라이브러리나 헤더가 포함되지 않아서 그런 것이 아닐까 추측이 됩니다.

또, 계속 컴파일 에러가 발생한다면 위의 분이 말씀하신 대로 해당 쿼리기능과 소켓기능을 모듈화해서 따로 컴파일해서 링크해서 사용하면 크게 문제 없을 것이라고 생각합니다..

이상 제 나름대로의 해결책이었습니다..^^*

Positive Energy

최종호의 이미지

fetch한 것은 소켓에 쏴주고 free하신다고 하셨는데,
SELECT의 결과로 100,000 건이 있다면 한번에 쏘는 것인지
100,000 번 쏘는 것인지 쓰신 글만으로는 확실치 않네요.
(처음 글에서는 후자인 듯 했으나 그 후의 글에서 전자인 듯 한 느낌도 드네요.)

1. 한번에 한 레코드만 쏘는 것이면,
당연히 메모리 할당이고 할 것도 없이 struct 변수 하나로 계속 이용하면 되겠고요.

2. 한번에 다 보내야 하는 경우는,
레코드 갯수가 메모리로 로드할 수 있는 적정한 수라는 것이 보장된다면
2번의 알고리즘을 선형적으로 증가시키기 보다는 지수적으로 증가시키면서 사용하시는게 나을 것입니다.
즉, 맨 처음에는 크기가 1, 다음에는 2, 그 다음에는 4, 8, 16, 32 등으로요.
어플리케이션의 성격을 안다면 초기 크기를 256 이나 1024 등으로 설정하시면 realloc 부담을 줄일 수 있을 것이고,
여기에 메모리 재활용 로직과 과다 할당 메모리 회수 로직을 추가하신 다면
메모리 할당/재할당을 거의 수행하지 않으실 수도 있고, 메모리 사용도 일정정도로 제한할 수 있을 것입니다.
그리고, array 처리를 통해서 DB접근 효율을 높이실 수 있을 것입니다.
이 경우에는 struct 리스트의 크기는 array 크기나 그 배수로
하시는 것이 처리하기 편리하실 것이고요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.