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

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

使用mysql2/promise的連接池因為連接沒有釋放,最后mysql會報Can't create more than max_prepared_stmt_count statements錯誤,那么它如何釋放連接呢?
我的代碼是這樣的
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 }
},
回答
編輯回答
檸檬藍

樓上的想法應(yīng)該是并發(fā)的請求數(shù)。
1。用await等待下一個請求之前,還沒有結(jié)束這一次鏈接。那么就存在多個請求使用單一mysql鏈接(這里是指全局變量)
2。單例模式給你的體驗就是和全局變量差不多,但是實際上單例不同于變量,單例類始終占用同樣內(nèi)存地址,1號請求和2號請求同樣是用一個單例類。
3??梢院唵卫斫鉃椋绻闶侨肿兞?,那么1號請求在使用global進行select的時候,2號也要使用global進行select

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

看完你的回復(fù),看了下官網(wǎng)API,可能你的寫法在其他包沒問題,但不符合mysql2的實現(xiàn)。比如一開始鏈接并沒有被創(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