nodejs singelton用于数据库连接和sequalize

时间:2016-07-10 16:12:19

标签: mysql node.js sequelize.js

我只是好奇。在需要和依赖注入的nodejs中打开数据库连接的正确方法是什么?

在php中,我会在全局变量中创建一个连接一次作为单例。然而,这似乎不是节点中的最佳实践。因此,我有以下问题:

  1. 您在哪里打开节点中的数据库连接?
  2. 您会打开一次或多次数据库连接吗?
  3. 如何在保持es6模块导入的同时只打开数据库连接一次?
  4. 如何通过es6模块加载打开多个数据库连接?
  5. 如果我多次导入同一个数据库,是否会导致多个连接?
  6. 我很了解并且喜欢控制我的服务器打开多少个连接。例如。如果我编写一个具有低db访问权限的后端工作程序,我宁愿只在那里打开一个数据库连接作为运行快速服务器我想在每个请求中打开一个连接。我怎样才能做到这一点?
  7. 我知道有类似的问题,但似乎没有完全回答我的问题:

    所以我的基本想法是:

    /* DbService.js */
    var Sequelize = require('sequelize');
    module.export = new Sequelize('database', 'username')
    

    与模型/实例相同

    /* Foo.js */
    var db = require("DbService.js");
    export var Foo = db.define('foo', {...});
    

    在代码中我比通过

    加载db / model
    /* server.js */
    
    import Foo from './Foo';
    Foo.findById('123').then(function(foo) {
        ...
    };
    
    var db = require("DbService.js");    
    db.query("SELECT * FROM `test`");
    

    然而在我看来,这总是打开一个单独的数据库连接,这感觉不对。那你怎么能这样做呢?

1 个答案:

答案 0 :(得分:1)

  1. 通常在应用程序加载时,但不一定 - 例如。您可能需要检查对DB上存储的凭据的身份验证。
  2. 由于您标记了sequelizejs,因此在创建new Sequelize实例时,您不会创建单独的连接,而是创建连接池。如果您没有指定用于汇集续集的配置,则会使用max 1 connection by default创建。
  3. 通过创建sequelize(new Sequelize())的实例,您只需初始化连接池。当出现实际需求(如执行查询)时,将创建实际连接并将其保留在池中。
  4. 您可以通过传递适当的池配置选项来创建可以处理多个连接的连接池。
  5. 假设数据库是指Sequelize实例,由于nodejs模块缓存的性质,您总是会在同一个实例中以相同的连接池结束。
  6. 每个请求的连接通常是一个坏主意,因为建立连接是相对耗费资源的操作。而是使用连接池。由于你使用了Sequelize,它已经节省了你的时间。
  7. 注 - 在nodejs中尚未实现的ES6模块。