Estou usando o driver nativo do node-mongodb com o MongoDB para escrever um site.
Tenho algumas perguntas sobre como gerenciar conexões:
É suficiente usar apenas uma conexão MongoDB para todas as solicitações? Existem problemas de desempenho? Caso contrário, posso configurar uma conexão global para usar em todo o aplicativo?
Caso contrário, é bom abrir uma nova conexão quando a solicitação chegar e fechá-la quando a solicitação foi processada? É caro abrir e fechar uma conexão?
Devo usar um pool de conexão global? Ouvi dizer que o driver tem um pool de conexão nativo. É uma boa escolha?
Se eu usar um pool de conexões, quantas conexões devem ser usadas?
Há outras coisas que devo observar?
node.js
mongodb
database-connection
connection-pooling
Vento livre
fonte
fonte
Respostas:
O committer primário para node-mongodb-native diz :
Portanto, para responder sua pergunta diretamente, reutilize o objeto db resultante
MongoClient.connect()
. Isso fornece pool e proporcionará um aumento notável da velocidade em comparação com as conexões de abertura / fechamento em cada ação de banco de dados.fonte
req.db
com este middleware: github.com/floatdrop/express-mongo-dbAbra uma nova conexão quando o aplicativo Node.js for iniciado e reutilize o
db
objeto de conexão existente :/server.js
/api/users.js
Origem: Como abrir conexões de banco de dados em um aplicativo Node.js / Express
fonte
Aqui está um código que gerenciará suas conexões do MongoDB.
Quando você inicia o servidor, chame
initPool
Em qualquer outro módulo, você pode fazer o seguinte:
Isso é baseado na documentação do MongoDB . Dê uma olhada nisto.
fonte
Gerenciar conjuntos de conexões mongo em um único módulo independente. Essa abordagem oferece dois benefícios. Em primeiro lugar, mantém seu código modular e mais fácil de testar. Em segundo lugar, você não é obrigado a misturar sua conexão com o banco de dados no objeto de solicitação, que NÃO é o local para um objeto de conexão com o banco de dados. (Dada a natureza do JavaScript, consideraria altamente perigoso misturar qualquer coisa a um objeto construído pelo código da biblioteca). Então, com isso, você só precisa considerar um módulo que exporte dois métodos.
connect = () => Promise
eget = () => dbConnectionObject
.Com esse módulo, você pode primeiro conectar-se ao banco de dados
Quando em vôo, seu aplicativo pode simplesmente ligar
get()
quando precisar de uma conexão com o banco de dados.Se você configurar seu módulo db da mesma maneira que a seguir, não apenas terá uma maneira de garantir que seu aplicativo não inicialize, a menos que você tenha uma conexão com o banco de dados, mas também uma maneira global de acessar seu pool de conexão com o banco de dados que irá se você não tiver uma conexão.
fonte
get()
, estamos obtendo um pool de conexões e não uma única conexão. Um conjunto de conexões, como o próprio nome indica, é uma coleção lógica de conexões com o banco de dados. Se não houver conexões no pool, o driver tentará abrir uma. Depois que a conexão é aberta, ela é usada e retornada ao pool. A próxima vez que o pool for acessado, essa conexão poderá ser reutilizada. O bom aqui é que a piscina gerenciará nossas conexões para nós. Se uma conexão for interrompida, talvez nunca saibamos, pois a piscina abrirá uma nova para nós.Se você possui o Express.js, pode usar o express-mongo-db para armazenar em cache e compartilhar a conexão MongoDB entre solicitações sem pool (uma vez que a resposta aceita diz que é o caminho certo para compartilhar a conexão).
Caso contrário - você pode olhar para o código fonte e usá-lo em outra estrutura.
fonte
Eu tenho usado um pool genérico com conexões redis no meu aplicativo - eu recomendo. É genérico e eu definitivamente sei que funciona com mysql, então eu não acho que você terá problemas com ele e o mongo
https://github.com/coopernurse/node-pool
fonte
Você deve criar uma conexão como serviço e depois reutilizá-la quando necessário.
minha amostra do App.js
e use-o onde quiser com
fonte
http://mongoosejs.com/docs/api.html
Confira a fonte do Mongoose. Eles abrem uma conexão e a vinculam a um objeto Model, portanto, quando o Objeto do modelo é necessário, é feita uma conexão com o DB. O motorista cuida do pool de conexões.
fonte
mongodb
.Eu implementei o código abaixo no meu projeto para implementar o pool de conexões no meu código, para que ele crie uma conexão mínima no meu projeto e reutilize a conexão disponível
fonte
A melhor abordagem para implementar o pool de conexões é criar uma variável de matriz global que mantenha o nome db com o objeto de conexão retornado pelo MongoClient e reutilize essa conexão sempre que precisar entrar em contato com o Banco de Dados.
No seu Server.js, defina var global.dbconnections = [];
Crie um serviço nomeando connectionService.js. Ele terá 2 métodos getConnection e createConnection. Portanto, quando o usuário chamará getConnection (), encontrará detalhes na variável de conexão global e retornará os detalhes da conexão, se já existir, caso contrário, chamará createConnection () e retornará Detalhes da conexão.
Chame este serviço usando db_name e ele retornará o objeto de conexão, se já tiver mais, ele criará uma nova conexão e retornará para você.
Espero que ajude :)
Aqui está o código connectionService.js:
fonte
mongodb.com -> novo projeto -> novo cluster -> nova coleção -> conectar -> endereço IP: 0.0.0.0/0 & db cred -> conecte seu aplicativo -> copie a cadeia de conexão e cole no arquivo .env do seu nó aplicativo e certifique-se de substituir "" pela senha real do usuário e também substituir "/ test" pelo seu nome db
crie um novo arquivo .env
fonte
Se estiver usando o express, existe outro método mais direto, que é utilizar o recurso incorporado do Express para compartilhar dados entre rotas e módulos no seu aplicativo. Há um objeto chamado app.locals. Podemos anexar propriedades a ele e acessá-lo de dentro de nossas rotas. Para usá-lo, instancie sua conexão mongo no arquivo app.js.
Agora, essa conexão com o banco de dados ou qualquer outro dado que você deseja compartilhar em torno dos módulos do seu aplicativo pode ser acessado dentro de suas rotas,
req.app.locals
conforme abaixo, sem a necessidade de criar e exigir módulos adicionais.Esse método garante que você tenha uma conexão com o banco de dados aberta durante a duração do seu aplicativo, a menos que opte por fechá-la a qualquer momento. É facilmente acessível
req.app.locals.your-collection
e não requer a criação de módulos adicionais.fonte