我非常简单的Node.js代码似乎不像它应该的那样正常工作。 _connectionQueue对象的Pool变得越来越长,并且应用程序死亡。我的意思是确实可以建立一个池,并且已经有预制的连接,但是它们不可重用或者插入请求太多且太快了?我不确定..

我尝试添加更多connectionLimit,如下所示:

let state = { pool: null }
export const connect = () => {
  state.pool = mysql.createPool({
    connectionLimit: 200,
    host: process.env.DATABASE_HOST || 'localhost',
    user: process.env.DATABASE_USER || 'root',
    password: process.env.DATABASE_PASSWORD || 'password',
    database: process.env.DATABASE_NAME || 'database'
  })
}

export const get = () => state.pool


该服务器最主要的工作是订阅和插入。它订阅了多个MQTT主题,并且仅尝试将消息插入RDB。每秒大约有100条消息到达,该代码如下所示。

mqttClient.on('message', function (topic, message) {

    if(topic.includes('sensor')){

      try {
        const data = JSON.parse(message.toString())

        if(validate(data.uuid)){
          const params = [data.a, data.b, data.c, ...]
          sensor.setStatus(params)
        }
      } catch(err){
        console.error(err)
      }

    }
}


export const setStatus = (params) => {

  const SQL = `INSERT INTO ...`

  db.get().query(SQL, params, (err, result) => {
    if (err) console.error(err)
  })
}


然后,我通过chrome-devtools看到了

Object
pool: Pool
config: PoolConfig {acquireTimeout: 10000, connectionConfig: ConnectionConfig, waitForConnections: true, connectionLimit: 200, queueLimit: 0}
domain: null
_acquiringConnections: []
_allConnections: (200) [PoolConnection, PoolConnection, …]
_closed: false
_connectionQueue: (11561) [ƒ, ƒ, ƒ, ƒ, …]
_events: {}
_eventsCount: 0
_freeConnections: []
_maxListeners: undefined
__proto__: EventEmitter
__proto__: Object




我已经将console.log放入setStatus中,如下所示:

export const setStatus = (params) => {

  const SQL = `INSERT INTO ...`
  console.log(`allConnections=${db.get()._allConnections.length}, connectionQueue=${db.get()._connectionQueue.length}`)

  db.get().query(SQL, params, (err, result) => {
    if (err) console.error(err)
  })
}


,并获得了这些。

allConnections=200, connectionQueue=29
allConnections=200, connectionQueue=30
allConnections=200, connectionQueue=31
allConnections=200, connectionQueue=32
allConnections=200, connectionQueue=33
allConnections=200, connectionQueue=34
...


好像服务器很好地创建了一个连接池,但是没有使用那些连接。取而代之的是,尝试越来越多地始终创建新的连接,而这些请求只会卡在_connectionQueue中。

最佳答案

似乎您每次要查询时都在创建一个新池。通用模型是在应用程序启动时创建一个池,然后根据需要使用该池中的连接(一个池,多个连接)。

同样,如果您使用的是简单的数据库模型,则可以通过将池设置为全局来简化对池的访问。以下是您可以尝试的代码的替代方法:

app.js

const mysql = require('mysql');

const connection = mysql.createPool({
  host: process.env.DB_HOST || '127.0.0.1',
  user: process.env.DB_USER || 'local_user',
  password: process.env.DB_PASSWORD || 'local_password',
  database: process.env.DB_NAME || 'local_database'
});

global.db = connection;


modules.js

export const setStatus = (params) => {
  let SQL = `INSERT INTO ...`
  db.query(SQL, params, (err, result) => {
    if (err) console.error(err)
    console.log(result)
  })
}


供进一步参考的文档:: https://github.com/mysqljs/mysql#pooling-connections

编辑1-日志池事件

db.on('acquire', function (connection) {
  console.log('Connection %d acquired', connection.threadId);
});

db.on('connection', function (connection) {
  console.log('Pool id %d connected', connection.threadId);
});

db.on('enqueue', function () {
  console.log('Waiting for available connection slot');
});

db.on('release', function (connection) {
  console.log('Connection %d released', connection.threadId);
});

关于mysql - 如何修复Pool的_connectionQueue?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58082792/

10-14 12:54
查看更多