- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于 SQL 连接池的问题。我的团队正在我们的 Node 应用程序之一中使用 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;
}
最佳答案
简短回答: Node require()
语句的“单例”性质可防止重新初始化多次出现的 knex
。因此,只要您不丢弃 db.
变量引用,最初创建的池就会在进程期间继续使用,而不是重新创建。
更多讨论...
... my team created an initialization function that returns a knex object configured to the correct database. Then that object is used to do said query. To me this seems redundant and can cause bad performance, because we initiate a knex object every time need to do a query instead of reusing a single knex object. Which i could ignore if knex already does this when you switch databases...
var db = require('./db.js');
node.js require
语句创建一个单例对象。 (您可能已经知道)这意味着您的程序第一次使用 require
语句调用该模块时,该模块及其数据将被初始化,但连续的相同 require
> 调用只会重用相同的模块引用,而不会重新初始化模块。
... the connection pool properties are redefined. So does that mean we are creating new pools every time, or does the SQL ( SQL Sever in this case) reuse the connection pool you already defined ?
因此,由于 require()
模块未重新初始化,因此最初创建的池将不会重新创建。除非您放弃 db
变量引用(下面将详细讨论)。
The question might not be Knex specific, like if i used a library like knex for C#, and call that library a similar way, would SQL Server know not to make more connection pools?
一般来说,您需要构建或获取连接一些代码,以便在整个进程的生命周期中正确管理连接池。 Knex 和大多数其他数据库包装器为我们做这件事。 (Knex 在 v0.18.3 之前使用 this library,在 v0.18.3 之后使用 this one。)
在应用程序进程的整个生命周期中正确初始化并使用单独初始化的池代码可以实现此目的。丢弃池并在进程中重新创建它违背了池化的目的。通常池化是作为进程初始化的一部分设置的。
此外,这可能只是您问题中的错误陈述,但您的 Node.js 模块正在创建连接池,而不是 SQL Server。
... The application from time to time needs to switch databases. my team created an initialization function that returns a knex object configured to the correct database.
从该声明中,我希望看到如下代码:
var db = require('./db.js');
var dbOther = require('./dbOther.js');
...分别建立不同的数据库连接。如果您使用的是:
var db = require('./db.js');
// ... do other stuff here in the same module ...
var db = require('./dbOther.js');
...那么您可能会丢弃对第一个数据库的原始引用,在这种情况下,是的,您在切换连接时会丢弃数据库连接和连接池。
或者,您可以执行如下操作:
// initialize the 2 connection pools
const dbFirst = require('./db.js');
const dbOther = require('./dbOther.js');
// set the active connection
var db = dbFirst;
// change the active connection
db = dbOther;
关于javascript - Knex.js/SQL : Knex/SQL Connection Pools,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49588672/
knex.raw(sql, bindings)和 knex.schema.raw(statement) . 似乎这两个函数具有不同的签名。 如果它们相等,我该如何使用 knex.schema.raw(
我有一些 Knex 迁移脚本,如下所示: 'use strict'; exports.up = function (knex) { return knex.schema .ha
我希望基本上在 Knex 中进行此类查询,但我无法使其正常工作: select distinct * from ( select *, 1 as rank from table1 where Wo
我想为 Knex 迁移中的主键设置默认值,但我遇到了问题。这是我最初的迁移: exports.up = (knex, Promise) => { return knex.schema.create
我发现有两种方法可以在迁移文件中编写 knex 迁移。 exports.up = function (knex) { return knex.schema .createTable
我正在使用 MSSQL,我有一个存储过程返回多个结果集(1 个用于数据,1 个用于记录计数)当我使用 knex.raw 调用此存储过程时,Knex 仅返回第一个结果集。如何使用 Knex + Node
我有一个表,当向其中添加新行时,所有现有行都需要更新。本质上,在一个“插入”完成之前,我不想让另一个“插入”发生。 所以我猜普通的行级锁或读锁是不够的,想在事务期间直接锁表。 有没有办法在 Knex
我正在尝试使用以下代码在迁移脚本中将列数据类型从日期修改为时间戳 knex.schema.alterTable('user', function(t) { t.timestamp('bifthda
我的 Knex 驱动程序出现间歇性错误: TimeoutError: Knex: 获取连接超时。游泳池可能已经满了。你错过了一个 .transacting(trx) 调用吗? 我猜,要么是我的 RDS
我有以下路线,我想获取与从第一个查询获得的 id 关联的总和 app.post('/VerEmpresas', function (req, res) { var r, dot, ide; k
在How to return a plain value from a Knex / Postgresql query? ,我询问了如何从 Knex 查询中获取列值,而没有包含列名的 JSON 对象。
我对 knex(和 node js)很陌生。如果存在,我需要编写插入,但我无法执行此操作。 下面不起作用,但有没有办法做到这一点? var val = "water"; knex('ingredien
有没有办法使用 Kenx 将 IF 语句添加到 SELECT 查询?假设我要执行以下查询: SELECT id, name, IF(grade<60,'Fail','Pass') AS examRes
我有一个关于 SQL 连接池的问题。我的团队正在我们的 Node 应用程序之一中使用 knex.js 库来进行数据库查询。应用程序不时需要切换数据库。因此,我的团队创建了一个初始化函数,该函数返回配置
我刚刚接触 knex,遇到了事务。我认为它很有用,因为它具有回滚功能。尝试使用它(参见下面的代码) await knex.transaction(trx => { knex.raw(delete fr
我正在为 Mysql 使用 Knex.js。我运行迁移并成功创建表。之后,当我通过此命令命令 knex seed:run 运行种子时,出现以下错误: Knex:warning - calling kn
我通过以下方式将 order by 绑定(bind)添加到 knex 原始查询。 -- Here userIds = [1,2,3] and dataOrder='DESC' knex.raw.que
尝试针对我的远程 postgres 数据库(不是本地主机)运行 knex seed:run 时出现以下错误:Knex:Error Pool2 - Error: connect ECONNREFUSED
我要在一个函数中对数据库执行五 (5) 项操作。我想将它们放入事务中,但我发现将每个都放入前一个操作的回调中有点奇怪。我怎样才能以优雅和可读的方式做到这一点? 最佳答案 Knex 具有内置的事务支持,
我正在尝试使用 Knex.js 查询生成器构建数据库迁移,但是我收到以下与外键关系相关的错误: Knex:warning - migrations failed with error: alter t
我是一名优秀的程序员,十分优秀!