- 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/
使用 caret::train() 运行逻辑回归模型时出现问题。LR = caret::train(Satisfaction ~., data= log_train, method = "glm",
我正在尝试将nginx容器作为我所有网站和Web服务的主要入口点。我设法将portainer作为容器运行,并且可以从互联网上访问它。现在,我正在尝试访问由另一个Nginx容器托管的静态网站,但这样做失
我有一个在 Windows XP SP3 x86 上运行的 Visual Studio 2008 C# .NET 3.5 应用程序。在我的应用程序中,我有一个事件处理程序 OnSendTask 可以同
我在 Eclipse 中创建了作为独立程序执行的此类,它可以毫无问题地连接所有 http URL(例如:http://stackoverflow.com),但是当我尝试连接到 https(例如 htt
我在我的 nginx 错误日志中收到大量以下错误: connect() failed (111: Connection refused) while connecting to upstream 我的
我正在尝试将新的 log4j2 与 Socket Appender 一起使用,但我有点不走运。这是我的 XML 配置文件:
我目前正在尝试寻找 Android 应用程序后端的替代方案。目前,我使用 php servlet 来查询 Mysql 数据库。数据库(Mysql)托管在我大学的计算机上,因此我无法更改任何配置,因为我
类MapperExtension有一些方法,before_insert, before_update, ...都有一个参数connection. def before_insert(self, map
嗨,我正在尝试更改位于连接库 (v 5.5) 中的文档的文档所有者,我仍在等待 IBM 的回复,但对我来说可能需要太长时间,这就是我尝试的原因逆向工程。 我尝试使用标准编辑器 POST 请求将编辑器更
我在 nginx( http://52.xx.xx.xx/ )上访问我的 IP 时遇到 502 网关错误,日志只是这样说: 2015/09/18 13:03:37 [error] 32636#0: *
我要实现 Connected-Component Labeling但我不确定我应该以 4-connected 还是 8-connected 的方式来做。我已经阅读了大约 3 种 Material ,但
我在Resources ->JMS ->Connection Factories下有两个连接工厂。 1) 连接工厂 2)集成连接工厂 我想修改两个连接工厂下连接池的最大连接数。资源 ->JMS ->连
我在将 mongoengine 合并到我的 django 应用程序时遇到问题。以下是我收到的错误: Traceback (most recent call last): File "/home/d
上下文 我正在关注 tutorial on writing a TCP server last week in Real World Haskell .一切顺利,我的最终版本可以正常工作,并且能够在
我在访问我的域时遇到了这个问题:我看到了我的默认 http500 错误 django 模板正在显示。 我有 gunicorn 设置: command = '/usr/local/bin/gunicor
我更换了电脑,并重新安装了所有版本:tomcat 8 和 6、netbeans 8、jdk 1.7、hibernate 4.3.4,但是当我运行 Web 应用程序时,出现此错误。过去使用我的旧电脑时,
您好,我是这个项目的新手,我在 CentOS7 ec2 实例上托管它时遇到问题。当我访问我的域时出现此错误: 2017/02/17 05:53:35 [error] 27#27: *20 connec
在开始之前,我已经查看了所有我能找到的类似问题,但没有找到解决我的问题的方法。 我正在运行 2 个 docker 容器,1 个用于 nginx,1 个用于 nodejs api。我正在使用 nginx
使用 debian 包将 kaa -iot 平台配置为单节点时。我收到以下错误。 himanshu@himpc:~/kaa/deb$ sudo dpkg -i kaa-node-0.10.0.deb
我是我公司开发团队的成员,担任管理员角色。我可以通过 https://developer.apple.com/ 访问团队的成员(member)中心 但是,当我尝试在 https://itunescon
我是一名优秀的程序员,十分优秀!