2011-05-25 9 views
5
bir kalıcı (Mongo) veritabanı bağlantısı

açmak için en iyi yolu/nedir .bunu her seferinde kapanış ben açılış yerine kalıcı bir veritabanı bağlantısı açmak için bir yol arıyorum ve düğüm-mongodb yerli sürücüleri kullanıyorum NodeJS

basitleştirilmiş bağlantı gibi görünebilir ...

var DB = new mongo.Db('vows', new mongo.Server("127.0.0.1", 27017, {})), 
    connection = DB.open(function(err, db) { 
     // Here we have access to db 
    }); 

nasıl uygulamada herhangi modülüne db nesne erişilebilir yapabilir? Her modül için bağlantıyı ayrı ayrı açmak zorunda kalmadan mı?

Bu, module.exports kullanılarak yapılabilir mi? Ya da global bir değişken mi?

cevap

1

Düzenleme: Mongoose kullanmayın, mongo-col veya mongo-client gibi bir şey kullanın. Daha sonra uygulamanızda açık olan tek bir müşteriniz var. Düzgün açılmış ve yapılandırılmış bir mongo istemcisi veren ./client.js dosyam var.


Mongoose daha kolay mongodb idare sağlayacak MongoDB üstünde katı bir soyutlamadır. Bu bir göz atmaya değer.

yeniden açmak nedir gerçekten olsa yapmak istiyorum müşteriniz size Mongo'da ile bir şey yapmak her zaman.

Başka bir veritabanına açık bir bağlantı sürdürmüyorsunuz.

Sadece bazı yardımcı/sarıcı fonksiyonları ile birlikte bir modül içinde DB yerleştirin.

+0

İstemciyi her seferinde yeniden açmak çok pahalı değil mi? –

+1

@BinWang Her şey konusunda yanıldım. Firavun kullanmamalısın, berbat. Ve müşteriyi her seferinde tekrar açmamalısın. – Raynos

+0

Şu anda [genel havuz] (https://github.com/coopernurse/node-pool) kullanıyorum. Aynı zamanda birçok müşteriyi açar (bir kerede "poolSize = 1" ile mongodb'a bağlanır), bir kerede açık kalmasını ve havuzu kendisi yönetmesini sağlar. Bu, ölçütü etkiler mi? –

5

Çözümümün: Artık

getClient = function(cb) { 
    if(typeof client !== "undefined") { 
     return cb(null, client); 
    } else { 
     db.open(function(err, cli) { 
      client = cli; 
      getClient(cb); 
     }); 
    } 
} 

yerine

db.open(function(err, client) { 
    ...stuff... 
}); 

Do:

getClient(function(err, client) { 
    ...stuff... 
}); 

İlk db çağrı bir bağlantı açar, diğerleri bağlantı olduğunu kullanırlar.

BTW: İstemcinin hala canlı olduğunu kontrol etme önerileri?

+0

İstemciyi görmenin yolu hala 'getClient' çağrıldıktan sonra setTimeout (...) ', ve mongo kabuğunda' db.runCommand ({serverStatus: 1}) kullanın. bağlantılar var. Müşterinin hala yaşayacağını sanmıyorum. –

İlgili konular