NodeJs访问MySQL老是报Pool Close问题。

本文讲述了在Node.js中遇到的MySQL Pool Close问题。为了解决这个问题,作者实现了队列来管理数据库请求,确保每个请求按顺序执行,避免了因异步操作导致的pool close错误。通过这种方式,简化了接口配置管理,使得只需在管理界面配置规则,而无需频繁重启服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写一个接口配置管理的一个东西。

比如前端要一个用户登录接口,是post请求,之前写的话,就是规规矩矩的在后台写代码,

通过路由什么怎么的跳转到相应的方法那里,然后获取到传过来的参数,拿到参数后,再调用数据库查询,判断用户存在与否

最后返回结果给前端。

我现在写的这个东西,将以前的这些步骤全都以抽里出一条或几天规则,然后按照事先定义好的顺序,由上而下依次执行,最后返回结果给调用者。

以后我只配置规则,不用开发接口,少接口只要在管理页面里添加一条就OK了,想改参数什么的,也只在管理界面修改即可完成,这样也不用重启服务器。

之前在NodeJs在调用MySQL的时候,由于我写的那个DBHelper类里创建连接,以是Pool的时候创建的,代码如下

   this.pool = mysql.createPool({
      connectionLimit: 5,
      host: 'localhost', // 数据库连接
      user: 'liaohb',    // 数据库名用户名
      password: 'xiaotuni', // 密码
      database: 'nodejs'   // 表空间
    });

由于每来一个请求都会createPool一个池,处理后我会调用 .end 方法来释放。
NodeJs是异步处理的,当前还没有处理完呢,后面的请求也接口着了,正在这个时候,前面调用了.end方法,后台还没有处理完的就开始报 pool close信息。

弄得我头都大了,今天突然想起来了用队列来管理请求,是不是就不会出现在这种情况了。

于是就写一个队列类,用来管理当前请求的,来一个就往队列里插入一个请求,由于队列的规则是先进先出的原理。

这样我瑞在创建createPool的时候,就不会出现在,前端调用 .end 时候,后面调用数据库请求的时候报 pool close的错误了。

我写的这个队列其实非常的简单,在这里标记一下。

/**
 * 队列管理,主要是用来处理量请求时
 * 由于要调用数据库,大量的请求,在调用的时候
 * 前面调用 .end方法,后面就会出现在pool close的情况。
 * 
 * 也许还有其它好的办法,目前就想到了这种方法。
 * 
 * @class ManagerQueue
 */
class ManagerQueue {

  /**
   * 创建一个带参数的构造函数 
   * @param {any} MySqlHelper  mysql操作类
   * @memberof ManagerQueue
   */
  constructor(MySqlHelper) {
    this._Queue = [];
    this.IsLock = false;
    this.MySqlHelper = MySqlHelper;
  }

  /**
   * 添加请求到队列里
   * 
   * @param {any} options  参数
   * @memberof ManagerQueue
   */
  AddQueue(options) {
    this._Queue.push(options);
    this.GetQueueLength();
    if (!this.IsLock) {
      this.IsLock = true;
      const args = this._Queue.shift();
      setTimeout(() => {
        this.NextQueue(args);
      }, 0);
    }
  }

  /**
   * 下一个
   * 
   * @returns 
   * @memberof ManagerQueue
   */
  Next() {
    const { _Queue } = this;
    if (_Queue.length === 0) {
      this.IsLock = false;
      console.log('---------队列处理完了------');
      return;
    }
    this.GetQueueLength();
    setTimeout(() => {
      this.NextQueue(_Queue.shift());
    }, 0);
  }

  /**
   * 执行下一请求
   * 
   * @param {any} args 
   * @returns 
   * @memberof ManagerQueue
   */
  NextQueue(args) {
   // ....
  }

  /**
   * 
   * 
   * @memberof ManagerQueue
   */
  GetQueueLength() {
    console.log('---------队列大小为:【%d】--------', this._Queue.length);
    return this._Queue.length;
  }
}

module.exports = ManagerQueue;

接口配置管理在 Github 上有,管理界面如下,有点丑呀,哈哈~~

这里写图片描述

Node.js 中的 `mysql2` 库通常用于操作 MySQL 数据库,而 `sqlPool` 的概念是指连接池,它可以管理数据库连接,避免频繁地创建和销毁连接,提高性能。当你想要限制连接池最大并发连接数时,可以使用 `maxListeners` 属性。 以下是一个完整的 `mysql2` 使用 SQL 连接池示例,并设置了 `maxListeners` 参数: ```javascript const mysql = require('mysql2/promise'); const { Pool } = mysql; // 创建连接池配置 const poolConfig = { host: 'your_host', user: 'your_user', password: 'your_password', database: 'your_database', connectionLimit: 10, // 设置最大并发连接数,默认为无限 maxPoolSize: 5, // 设置最大空闲连接数 queueLimit: 0, // 如果达到最大连接数,则阻塞等待 waitForConnections: true, acquireTimeoutMilliseconds: 60000, // 超时时间 }; // 创建并初始化连接池 let sqlPool; try { sqlPool = new Pool(poolConfig); } catch (error) { console.error('Error initializing connection pool:', error); } // 示例函数,使用连接池执行查询 async function queryWithConnection(query, params) { try { const connection = await sqlPool.getConnection(); let result; try { result = await connection.query(query, params); } finally { connection.release(); // 返回连接到池中,而不是关闭 } return result; } catch (error) { console.error('Error executing query:', error); } } // 设置 maxListeners 以限制监听事件的数量,比如防止过度接收连接请求导致内存溢出 sqlPool.maxListeners = 10; // 将最大监听数设置为 10,这里可以根据实际需求调整 // 使用 pool.query 或 queryWithConnection 来执行SQL语句 queryWithConnection('SELECT * FROM your_table', []) .then(result => console.log(result)) .catch(error => console.error(error)); //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值