2013-01-23 3 views
1

나는 그런 내 MongoDB를 연결 persit하기 위해 노력하고있어 :지속성 및 MongoDB를

mongo **ptr = (mongo**)get_env(argv, US_VHOST_DATA); 

if(!ptr[0]) { 
    mongo_replica_set_init(conn, "cluster"); 
    mongo_replica_set_add_seed(conn, "mongo1.mongood.com", 27017); 
    mongo_replica_set_add_seed(conn, "mongo3.mongood.com", 27017); 
    mongo_replica_set_add_seed(conn, "mongo4.mongood.com", 27017); 
    mongo_replica_set_add_seed(conn, "mongo5.mongood.com", 27017); 
    mongo_replica_set_add_seed(conn, "mongo6.mongood.com", 27017); 
    mongo_replica_set_client(conn); 
    mongo_cmd_authenticate(conn, "dbname", "dbuser", "dbpass"); 

    ptr[0] = (mongo*)calloc(1, sizeof(conn)); 
} else { 
    conn[0] = *ptr[0]; 
} 
int count = 0; 
count = mongo_count(ptr[0], "dbname", "coll", NULL); 

mongo_destroy(ptr[0]); 

xbuf_xcat(reply, "<h3>%d</h3>", count); 

그러나 분명히, 그것은 작동하지 않습니다 ... 내 목표는 각 요청에 연결 시간을 방지하는 것입니다 (~ 30ms의)

할 수 있습니까? 이 예에서 무엇이 잘못 되었습니까?

코드는 불평하지 않지만 올바른 카운트 번호 대신 -1을 반환합니다.

도움 주셔서 감사합니다.


[편집] 다른 블록을 제거하고 예상대로 mongo_destroy 라인 그냥 작동 제거 \ O/

+0

__thread 키워드를 사용하여 스레드 당 연결을 사용하는 것이 좋습니다. ** __ thread conn ** = 0; 그런 다음 ** if (! conn) {setup(); } ** 이렇게하면 MongoDB 기능을 더 잘 사용할 수 있습니다. – Gil

+0

어딘가에 샘플이 있습니까? – solisoft

+0

G-WAN 다운로드와 함께 제공되는 mysql.c 예제를 살펴 본다. – Gil

답변

2

내가 몽고를 사용하지 않는,하지만 당신은 [0 ptr에 할 공간을 할당하는 코드에서 찾고 적이 ]하지만 아무 것도 할당하지 않았으므로 후속 호출은 항상 -1을 반환합니다. 그리고 else 블록은 conn 대신에 ptr [0]을 사용하여 모든 mongo 호출을하기 때문에 아무것도하지 않습니다. 따라서 else 블록을 제거하거나 ptr [0] 대신 conn을 사용하여 모든 mongo 호출을 수정하고 잊지 마십시오 calloc 뒤에 ptr에 conn을 할당한다.

+0

그래, 나는 C 개발자가 아니라고 깜빡했다. 실제로 그것을 배우려고 시도했다. – solisoft

+0

방금 ​​ptr [0] = conn;을 추가했다. calloc 아래 및 else 블록을 제거 ... 여전히 -1이 반환 됨 스크립트를 처음 호출 할 때 올바른 번호를 반환하고 다시로드하면 -1이 반환됩니다. – solisoft

0

G-WAN 다운로드와 함께 제공된 mysql.c example을 살펴보십시오. 그것은 당신을 혼란스럽게하지 않는 방식으로 똑같은 일을합니다.