鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  HTML/ node mysql2/promise的連接池如何釋放連接?

node mysql2/promise的連接池如何釋放連接?

使用mysql2/promise的連接池因?yàn)檫B接沒(méi)有釋放,最后mysql會(huì)報(bào)Can't create more than max_prepared_stmt_count statements錯(cuò)誤,那么它如何釋放連接呢?
我的代碼是這樣的
1.創(chuàng)建連接

const mysql = require('mysql2/promise')
 var connection =  mysql.createPool(mysqlConfig)
  global.connection = connection

2.把鏈接掛載到ctx上

app.use(async (ctx, next) => {

  ctx.mysqlConection = global.connection
  // console.log(global.connection, '99999999999')
  ctx.controller = controller
  ctx.service = service
  ctx.are = are
  ctx.iz = iz
  ctx.rules = rules.rules
  ctx.model = mongodb.mongoose.models;
  await next()
  ctx.mysqlConection.end()

})```

3. 在controller就可以使用連接
findUv: async function (ctx) {
    let condition = ctx.request.body
    let sql = `SELECT count AS uv FROM gugudai_count ORDER BY id ASC LIMIT 1`
    console.log('******************2',ctx.mysqlConection.getConnection)
 
    const [rows, fields] = await ctx.mysqlConection.execute(sql)
    // let conne=await ctx.mysqlConection.getConnection;
    // console.log(conne)
    return { rows }
},
回答
編輯回答
檸檬藍(lán)

樓上的想法應(yīng)該是并發(fā)的請(qǐng)求數(shù)。
1。用await等待下一個(gè)請(qǐng)求之前,還沒(méi)有結(jié)束這一次鏈接。那么就存在多個(gè)請(qǐng)求使用單一mysql鏈接(這里是指全局變量)
2。單例模式給你的體驗(yàn)就是和全局變量差不多,但是實(shí)際上單例不同于變量,單例類(lèi)始終占用同樣內(nèi)存地址,1號(hào)請(qǐng)求和2號(hào)請(qǐng)求同樣是用一個(gè)單例類(lèi)。
3??梢院?jiǎn)單理解為,如果你是全局變量,那么1號(hào)請(qǐng)求在使用global進(jìn)行select的時(shí)候,2號(hào)也要使用global進(jìn)行select

2017年11月16日 00:15
編輯回答
孤慣

看完你的回復(fù),看了下官網(wǎng)API,可能你的寫(xiě)法在其他包沒(méi)問(wèn)題,但不符合mysql2的實(shí)現(xiàn)。比如一開(kāi)始鏈接并沒(méi)有被創(chuàng)建,而是按需創(chuàng)建,并需要自己回收。

// For pool initialization, see above
pool.getConnection(function(conn) {
   // Do something with the connection
   conn.query(/* ... */);
   // Don't forget to release the connection when finished!
   pool.releaseConnection(conn);
})

mysql2

2018年4月28日 07:57