如何在 node.js 中的模块之间共享连接池?

Posted

技术标签:

【中文标题】如何在 node.js 中的模块之间共享连接池?【英文标题】:How to share connection pool between modules in node.js? 【发布时间】:2016-12-09 10:16:10 【问题描述】:

我对如何在 node.js 模块中正确实现 postgres 连接池知之甚少。

我的问题是:当我在需要连接到 pg 的每个模块中创建新池时是否有问题?

有没有办法为整个应用程序全局创建池?

谢谢。

【问题讨论】:

【参考方案1】:

我建议不要导出池,而是提供与其连接的函数。使用 promise-mysql

var mysql = require('promise-mysql');

var connectionPool = mysql.createPool(
  host     : "127.0.0.1",
  user     : '******',
  password : '******',
  database : '******',
  port     : '3306'
);

module.exports=

  getConnection: function()
    return new Promise(function(resolve,reject)
      connectionPool.getConnection().then(function(connection)
        resolve(connection);
      ).catch(function(error)
        reject(error);
      );
    );
  
 

我发了simple blog post about MySQL pool sharing,你可以在这里阅读更多

【讨论】:

【参考方案2】:

在 pgpool.js 文件中定义池

var pg = require('pg');
var pool;
var config = 
  user: 'foo',
  database: 'my_db',
  password: 'secret',
  port: 5432, 
  max: 10,
  idleTimeoutMillis: 30000,
;

module.exports = 
    getPool: function () 
      if (pool) return pool; // if it is already there, grab it here
      pool = new pg.Pool(config);
      return pool;
;

像这样使用它:

var db = require('./a/path/to/pgpool.js');
var pool = db.getPool();

【讨论】:

或者,您可以使用module.exports = new pg.Pool(config)。由于模块缓存,这将始终将池的相同实例返回到 require 的每个文件。 我可以确认这也适用于 mysql npm 包。谢谢

以上是关于如何在 node.js 中的模块之间共享连接池?的主要内容,如果未能解决你的问题,请参考以下文章

深入解析Node.js使用MySQL连接池

Node.js 和前端之间共享的模块中的模块语法和依赖关系

node.js中如何配置redis与连接池?

node.js mysql 池 beginTransaction & 连接

MODULE_NOT_FOUND 尝试在 Node JS / TypeScript 项目中的模块之间按目录共享代码

使用池的node.js mysql中的错误处理和丢失连接