Berkeley DB 관련 질문
환경은 자원이 제한적인 Embedded 환경이고 꽤 많은 테이블들이 있습니다. 적어도 20개 가까이 되는듯 합니다.
문제는 D/B 요청시마다 D/B 를 열고 닫으니 속도가 너무 느리다는 점입니다.
그래서 D/B Handler(?)를 Static 변수로 메모리에 올려 놓고 사용하려는데
구조를 어떻게 가져가야 할지 고민입니다.
그래서 첫번째 방법은
모든 테이블을 아래와 같이 하나의 DB 구조체에 몽땅 털어 넣고
typedef struct my_dbs { //tables DB *DB1 DB *DB2 . . DB *DB19 DB *DB20 //location of files char *DB1_findName; char *DB2_findName; . . char *DB19_findName; char *DB20_findName; } MY_DBS;
부팅시 Static 변수로 올려 놓은 후,
각 해당 모듈이 실행/종료 될때마다 사용하는 D/B를 아래와 같이 시작/종료하는방법입니다.
-시작
open_database(&(myDatabase->phonebook_dbp)
-종료
myDatabase->DB1->close(myDatabase->DB1, 0);
두번째 방법은
첫번째 방법처럼 하나의 구조체에 몽땅 넣는게 아닌 각각의 모듈에서 해당하는 DB table만 구조체에 넣고
모듈 시작시 static 변수로 올려놓고 D/B 시작/종료는 첫번째 방밥과 같이 하는 방법입니다.
세번째 방법은
두번째 방법과 같이 각각의 모듈에서 해당하는 Table만 구조체에 넣는건 같지만
Static으로 올려 놓지 않고 모듈안에서만 사용하는 방법입니다.
근데, DB를 핸들하는 모듈이 원래 따로 있는데
이 구조로 가게되면 DB핸들하는 모듈 뿐만 아니라 요청하는 모든 모듈들을 수정해야 하는 문제가 생깁니다.
질문)
1. 위의 방법 중 어느방법이 효율적인지요 아님 다른 효율적인 방법이 있는지요??
2. 각각의 모듈에서 같은 D/B를 Access할 경우가 많습니다. 하나의 모듈에서 Open후 다른 모둘에서도 사용하려고 Access시도하게 되면 문제가 발생할텐데 회피할 수 있는 일반적인 방법은 무엇인지요? Berkeley DB 자체 함수가 있는줄은 아는데 위와 같은 구조에서 확실히 보장이 되는지 의문입니다.
3. 실제 Open/Close는 각각의 모듈에서 하지만 Static으로 올려 놓고 사용하려니 자원을 얼마나 물고 있을지 걱정입니다.
(사실 제가 java만 해와서 C 프로그래밍에 익숙치 않습니다.--;;)
댓글 달기