【问题标题】:How to make node.js mysql connection pooling available on startup如何在启动时使 node.js mysql 连接池可用
【发布时间】:2017-05-28 18:29:02
【问题描述】:

每次运行我的 showData.js 脚本时,它都会调用

var pool  = mysql.createPool({

有没有办法在 node.js 服务器启动时创建连接池?

我尝试将 createPool 添加到 server.js,但调用时似乎无法从 showData.js 脚本访问对象

pool.getConnection(function(err,connection){

是否需要在 node.js 服务器启动时启动连接池?

即使在调用 connection.release 并且脚本关闭之后,mysql 连接池是否仍然存在

编辑 @Marco,我收到 ReferenceError: pool is not defined. 我知道问题是我没有将 pool 拉入 showData.js。根据node.js,多次加载一个模块是可以的。

来自https://nodejs.org/api/modules.html

缓存

模块在第一次加载后被缓存。这个 意味着(除其他外)每次调用 require('foo') 都会得到 返回完全相同的对象,如果它会解析为相同的 文件。

多次调用 require('foo') 可能不会导致模块代码 多次执行。这是一个重要的特点。用它, 可以返回“部分完成”的对象,从而允许传递 即使会导致循环,也要加载依赖项。

如果你想让一个模块多次执行代码,那么导出 一个函数,并调用该函数。

这是我的最新设置:

lib/dbpool.js

var mysql = require('mysql');
var pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'someco.com',
  user            : 'pinco',
  password        : 'pallino'
});

module.exports = pool;

server.js

const pool = require('./lib/dbpool');

showData.js

'use strict';
module.exports = router => {
    router.route('/show').post((req, res) => {
        pool.query('SELECT * FROM db.users', function(err, rows, fields) {

server.js 和 showData.js 中是否需要以下行?

const pool = require('./lib/dbpool');

【问题讨论】:

  • 如果server.js中不需要pool,可以只在showData.js中导入模块。如果两者都需要,可以在两个文件中添加“require”。

标签: javascript mysql node.js connection-pooling


【解决方案1】:

定义一个名为 lib/dbpool.js 的模块,其内容如下:

var mysql = require('mysql');
var pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'someco.com',
  user            : 'pinco',
  password        : 'pallino'
});

module.exports = pool;

然后在您的应用代码中使用:

const pool = require('./lib/dbpool');

app.post('/your/app/url', (req, res) => {
  pool.query('your query', function(err, rows, fields) {
    if (err) throw err;
    /* Manage your results here */

  });
}

pool.query 实际执行:pool.getConnection() 然后 connection.query() 然后 connection.release()

【讨论】:

  • 这是很好的信息。谢谢马尔科。我担心的是我的应用程序代码每分钟被调用数千次。每次创建 const pool 时会发生什么?我担心的是,也许应该在其他地方创建连接池并保持打开状态。或者这是一个错位的担忧?在我看来,createPool 一直被调用,而我认为连接池应该打开一次并保持打开状态。
  • @mcmacerson 连接池应该只创建一次。如果你在 app.js 中导入你的模块,并且你有所有被调用的端点,那么池将被创建一次并且连接将被重用。
  • @mcmacerson 如果每个模型都存在于自己的文件中,并且每个模型都需要pool,那么代码const pool = require('./lib/dbpool'); 是否会在每次实例化模型时重新运行连接代码?
  • @KearneyTaaffe 我相信,基于 Marco Altieri 的 cmets,如果在 app.js 中导入,连接代码只会运行一次。有比较懂的人,如有错误请指正。
  • 我在我的 nodejs 应用程序中使用了这个模式。我每秒处理 60 笔交易。对于每个请求,我都在执行数据库写入。但是经过几分钟的连续 TPS,我的 docker 容器崩溃了。有人遇到过这个问题吗?
【解决方案2】:

此解决方案使用一个变量来保存池并在第一次初始化后返回,

const mysql = require("mysql2/promise");
var pool;
module.exports = function getPool() {
    if (!pool) {
      const config = {
        connectionLimit: 100,
        host: process.env.SQL_HOST,
        user: process.env.SQL_USER,
        password: process.env.SQL_PASSWORD,
        database: process.env.SQL_DATABASE,
        debug:false,
        waitForConnections: true,
        multipleStatements: true
      };
      pool = mysql.createPool(config);
    }
    return pool;        
};

const getPool = require('./db.js');

async function handleREquest(req, res) {
   const result = getPool().query('...');
   //...
}

基于此 Github 代码的代码:HERE

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 2018-05-28
    • 2013-10-01
    • 2014-11-26
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多