nodejs singelton用于sequalize的数据库连接

我只是好奇。 使用require和dependency injection在nodejs中打开数据库连接的正确方法是什么?

在PHP中,我将创build一个连接作为一个全局variables中的单例。 但是,这似乎不是节点中的最佳实践。 因此我有以下问题:

  1. 你会在哪里打开节点的数据库连接?
  2. 你会打开数据库连接一次或多次?
  3. 如何在保持es6模块导入的同时只打开一次数据库连接?
  4. 如何通过es6模块加载打开多个数据库连接?
  5. 如果我多次导入同一个数据库,是否会导致多个连接?
  6. 我宁愿知道并想要控制我的服务器打开了多less个连接。 例如,如果我写一个低数据库访问的后端工作人员,我宁愿只打开一个数据库连接那里运行一个快速服务器,我想打开每个请求的连接。 我怎样才能做到这一点?

我知道有类似的问题,但似乎并没有完全回答我的问题:

  • 在节点ES6中的Singlton
  • 在哪里连接到节点中的数据库?
  • NodeJS Expressdependency injection和数据库连接

所以我的基本想法是:

/* 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', {...}); 

而在代码中我比通过加载数据库/模型

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

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

  1. 通常当应用程序被加载,但不一定 – 例如。 您可能需要检查数据库上存储的凭据的身份validation。
  2. 由于您标记了sequelizejs,因此您在创buildnew Sequelize实例时不创build单独的连接,而是创build连接池。 如果你没有指定configuration集合sequelize 默认情况下将创build与最大1连接 。
  3. 通过创build一个sequelize( new Sequelize() )的实例,你只是初始化连接池。 实际的连接将被创build并保存在池中,当出现实际的需求时就像执行查询一样。
  4. 您可以通过传递适当的池configuration选项来创build可以处理多个连接的连接池。
  5. 假设数据库的意思是Sequelize实例,由于nodejs的模块caching的性质,你总是会在相同的实例中,因此相同的连接池。
  6. 每个请求的连接通常是一个坏主意,因为build立连接相对而言是一种资源消耗操作。 而是利用连接池。 既然你使用Sequelize,它已经节省了你的时间。

注 – 在nodejs中还没有实现ES6模块。