2013-01-23 234 views
1

我想persit我的MongoDB連接這樣的:持久性和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); 

但很明顯,它不工作... 我的目標是避免連接時間對每個請求(〜30毫秒)

這是可行的嗎?這個例子有什麼問題?

該代碼不會抱怨,但它只是返回-1而不是正確的計數。

謝謝你的幫助。


[編輯]刪除else塊和去除mongo_destroy行只是按預期工作\ O/

+0

我建議你寧願使用每個線程連接通過使用__thread關鍵字:** __ thread conn ** = 0;然後** if(!conn){setup(); }這樣你將會更好地使用MongoDB功能。 – Gil

+0

某處有樣品? – solisoft

+0

查看隨G-WAN下載提供的mysql.c示例。它做同樣的工作,不會混淆你 – Gil

回答

2

我從來沒有用過蒙戈,但看你的代碼,你分配的空間PTR [0 ]但你還沒有分配任何東西,所以後續的調用總是返回-1。 而else塊沒有做任何事情,因爲你使用ptr [0]而不是conn進行所有mongo調用,所以要麼刪除else塊,要麼更正所有的mongo調用來使用conn而不是ptr [0],並且不要忘記在calloc之後將conn分配給ptr。

+0

是的,我忘了說我不是一個C開發人員:)試圖學習它實際 – solisoft

+0

我剛剛添加ptr [0] = conn;在calloc下面並移除else塊...但仍然返回-1 第一次調用腳本時,它返回正確的數字...然後重新提供-1 – solisoft

0

看看G-WAN下載提供的mysql.c example。它以不會混淆你的方式完成相同的工作。