我已经使用Express,Knex和Bookshelf构建的简单REST API。
我正在与Jmeter进行一些性能测试,我注意到如果我调用执行以下查询的API,则没有问题:
public static async fetchById(id: number): Promise<DatasetStats> {
return DatasetStats.where<DatasetStats>({ id }).fetch();
}
datasetStats是书架模型
但是,如果我将jmeter设置为呼叫以下内容,我会有一个错误:er_con_count_error:一分钟后的连接太多:
import * as knex from 'knex';
@injectable()
export class MyRepo {
private knex: knex;
constructor() {this.knex = knex(DatabaseConfig); }
async fetchResourcesList(datasetName: string): Promise<any> {
return this.knex.distinct('resource').from(datasetName);
}
}
问题可能是我为每个请求创建一个KNEX对象?
是。如果为每个请求创建新的KNEX实例,则无法控制与MySQL DB的并发连接总数。另外,您将无法从KNEX的连接池重新使用已经打开连接,因此在每个查询上打开与数据库的新TCP连接非常低的效率。另外,如果您在查询之后不破坏KNEX实例,则连接将保持打开状态,直到某些闲置超时 应用程序会泄漏内存。