作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我非常简单的 Node.js 代码似乎没有像它应该做的那样连接池工作。 Pool
对象的 _connectionQueue
会变得越来越长,应用程序就会终止。我的意思是它确实创建了一个池,并且已经有预先建立的连接,但它们不可重用,或者插入请求太多太快?我不确定..
我尝试添加更多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/
我是一名优秀的程序员,十分优秀!