连接/断开数据库的最佳实践是什么? [英] What is the best practice to connect/disconnect to a database?

查看:57
本文介绍了连接/断开数据库的最佳实践是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何与MEAN堆栈应用程序中的数据库进行连接.特别是,什么时候应该创建与数据库的连接,什么时候应该破坏与数据库的连接.我应该在每个新的HTTP请求上创建和销毁连接,还是应该存储一次创建的连接,并尽可能长时间地将其用于任何后续请求.我使用猫鼬作为建模工具.

I'd like to know how to work with connectivity to a database in MEAN stack application. In particular, when should I create a connection to a database and when should I destroy a connection to a database. Should I create and destroy a connection on every new HTTP request or should I store a once created connection and use it for any subsequent requests as long as possible. I use Mongoose as a modeling tool.

这里是一个例子.这是我的 routes.js 文件,其路由为/index .对此路线的请求应从MongoDb数据库获取一些日期.现在困扰着我如何连接和断开与数据库的连接.是的,我完全按照Mongoose文档中的说明连接和断开数据库连接,但是在严重的生产环境中这是正确的方法吗?

Here is an example. This is my routes.js file with a route /index. A request to this route should fetch some date from MongoDb database. It bothers me how I connect and disconnect to a database now. Yes, I connect and disconnect to a database exactly as written in Mongoose docs, but it it the right way to do it in a serious production environment?

var express = require('express');
var router = express.Router();

var config = require('./db-config');

// I create a Mongoose instance as a module object,
// as opposite to create it in every request handler function below.
var mongoose = require('mongoose');

var productSchema = require('../db/productSchema'); // model schema is also a module-wide object

// And here is a request handler function.
// It is called on every request as a brand new.
// I create and destroy a database connection inside this request handler
router.get('/index', function(req, res, next) {

    // I connect to a database on every request.
    // Do I need to do it here in a request handler?
    // May I do it outside of this request handler on a module-wide level?
    mongoose.connect('mongodb://my_database');

    // I create a new connection here in a request handler.
    // So it lives only during this request handler run.
    // Is this the right way? May I do it outside of this request handler 
    // on a module-wide level and somehow keep this connection and use it 
    // in every subsequent requests to this or any other route in the app?
    var db = mongoose.connection;

    db.on('connecting', function() {
        console.log('connecting');
    });

    db.on('connected', function() {
        console.log('connected');
    });

    db.on('open', function() {
        console.log('open');
    });

    db.on('error', console.error.bind(console, 'connection error'));

    db.once('open', function(cb) {
        var Product = mongoose.model('Product', productSchema);
        Product.find({category: "books"}, function(err, prods) {
            if (err) return console.error(err);

            // I close a connection here in a callback. 
            // As soon as successfully fetched the data. 
            // Do I need to close it after every request? 
            // What is the right place and time to do it? 
            db.close(disconnect);
            res.json(prods);
        });
    });
})

找到了一些很好的答案:

Found some good answers:

https://softwareengineering.stackexchange.com/questions/142065/creating-database-connections-do-it-on-or-for-each-query

管理以下数据库中的数据库连接的最佳做法是什么.NET?

推荐答案

最佳做法是将数据库连接放在单独的模块(db.js)中

Its best practice to have your db connection in a separate module (db.js)

var mongoose = require('mongoose')

mongoose.connect('mongodb://localhost/dbname', function(){
    console.log('mongodb connected')
})
module.exports = mongoose

每个模型都应该有一个单独的模块来进行数据库连接(post.js)

Each model should have a separate module that takes in the db connection (post.js)

var db = require('../db.js')
var Post = db.model('Post', {
    username: {type: String, required: true},
    body: {type: String, required: true},
    date: { type: Date, required: true, default: Date.now }  
})

module.exports = Post

然后,每当您需要使用该数据集时,都需要它并进行调用

Then whenever you need to use that data set just require it and make calls

var Post = require('/models/post')
Post.save()
Post.find()

这篇关于连接/断开数据库的最佳实践是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆