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

来源:互联网 发布:软件企业即征即退期限 编辑:程序博客网 时间:2024/05/22 20:08

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

比如前端要一个用户登录接口,是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 上有,管理界面如下,有点丑呀,哈哈~~

这里写图片描述

原创粉丝点击