【发布时间】:2018-09-10 08:03:55
【问题描述】:
我有一个关于 SQL 连接池的问题。我的团队正在我们的一个节点应用程序中使用 knex.js 库来进行数据库查询。 应用程序不时需要切换数据库。所以我的团队创建了一个初始化函数,该函数返回一个配置到正确数据库的 knex 对象。然后该对象用于执行所述查询。对我来说,这似乎是多余的,并且会导致性能下降,因为每次需要执行查询时我们都会启动一个 knex 对象,而不是重用单个 knex 对象。如果 knex 在您使用哪些数据库时已经这样做了,我可以忽略这一点(如果有人也可以阐明这个问题,那将是太棒了!)。此外,(这使我想到了上面标题为我的问题)连接池属性被重新定义。那么这是否意味着我们每次都在创建新池,或者 SQL(在本例中为 SQL Sever)是否重用您已经定义的连接池?这个问题可能不是 Knex 特定的,比如如果我使用了一个库,比如 C# 的 knex,并以类似的方式调用该库,SQL Server 会知道不创建更多的连接池吗?
示例代码:
/** db.js
* @param {any} database
* @returns db: Knex
*/
module.exports = ( database ) => {
var knex = require('knex')({
client: 'mssql',
connection: {
database: database,
server: '127.0.0.1',
user: 'your_database_user',
password: 'your_database_password'
},
pool: {
min: 0,
max: 10,
idleTimeoutMillis: 5000,
softIdleTimeoutMillis: 2000,
evictionRunIntervalMillis: 500
}
});
return knex;
};
Index.js
var db = require('./db.js');
/**
* @returns users:Array
*/
const getUsers = async() => {
const users = await db('master')
.select()
.from('users_table')
.orderBy('user_id');
return users;
}
【问题讨论】:
-
.withSchema([schemaName])有什么问题? -
如前所述,只导出一个池,查询时使用
withSchema。您不需要为每个数据库使用单独的池。 -
如果您在单个数据库实例中使用多个模式,那么 .withSchema 是一个好主意。但它不适用于访问多个数据库实例。
标签: javascript sql-server node.js knex.js