【问题标题】:Pattern for handling MySQL database connections within an express application在 express 应用程序中处理 MySQL 数据库连接的模式
【发布时间】:2014-11-09 06:48:48
【问题描述】:

我正在使用 express 4.x,以及最新的 MySQL node 包。

PHP 应用程序(我最熟悉)的模式是包含某种数据库连接公用文件,并在脚本完成后自动关闭连接。在 express 应用中实现它时,它可能看起来像这样:

// includes and such
// ...
var db = require('./lib/db');

app.use(db({
  host: 'localhost',
  user: 'root',
  pass: '',
  dbname: 'testdb'
}));

app.get('/', function (req, res) {
  req.db.query('SELECT * FROM users', function (err, users) {
    res.render('home', {
      users: users
    });
  });
});

请原谅缺少错误处理,这是一个原始示例。无论如何,我的db() 函数返回的中间件将连接到数据库并存储连接对象req.db,有效地为每个请求提供一个新对象。这种方法有几个问题:

  • 这根本无法扩展;数据库连接(昂贵)将随着相当便宜的请求线性扩展。
  • 数据库连接不会自动关闭,如果出现未捕获的错误会终止应用程序。您必须抓住它并重新连接(感觉像是一种反模式)或编写更多的中间件,所有东西都必须调用 pior 来输出以确保连接关闭(可以说是反 DRY)

我看到的下一个模式是在应用启动时简单地打开一个连接。

var mysql = require('mysql');

var connection = mysql.createConnection(config);
connection.on('connect', function () {
  // start app.js here
});

这个问题:

  • 仍然无法缩放。在我的生产设备(1gb-2gb RAM,3.0ghz 四核 CPU)上,一个连接很容易被超过 10-20 个请求阻塞。
  • 连接仍然会在一段时间后超时,我必须提供一个错误处理程序来捕获它并重新连接 - 非常笨拙。

我的问题是,在快速应用程序中处理数据库连接应该采取什么样的方法?它需要扩展(不是无限的,只是在合理范围内),我不应该在路由中手动关闭/为每条路径包含额外的中间件,而且我(最好)不想捕获超时错误并重新打开它们。

【问题讨论】:

  • 我推荐你阅读sequelizejs.com
  • 您的问题可能取决于您在“中间件”区域所做的工作。您查询的规模是多少:每秒查询次数是否很多?您是否对许多查询重复使用相同的连接?如果您要提出许多请求,您可能需要结帐pooling。池化时,请确保在完成连接后将连接释放回池中。

标签: mysql node.js express node-mysql


【解决方案1】:

既然你在谈论 NodeJS 中的 MySQL,我不得不指出你 KnexJS!您会发现编写查询更有趣。他们使用的另一件事是连接池,它应该可以解决您的问题。它使用一个名为generic-pool-redux 的小包来管理数据库连接之类的事情。

我们的想法是让您的快速应用程序通过代码访问数据库。事实证明,该代码使用连接池在连接之间共享负载。我初始化我的东西是这样的:

var Knex = require('knex');
Knex.knex = Knex({...}); //set options for DB

在其他文件中

var knex = require('knex').knex;

现在所有可以访问数据库的文件都使用同一个连接池(在启动时设置一次)。


我确信还有其他适用于 Node 和 MySQL 的连接池包,但如果您正在执行任何动态或复杂的 SQL 查询,我个人建议使用 KnexJS。祝你好运!

【讨论】:

  • 我花了一天时间来解决这个错误,并进行了各种尝试和错误修复。最后,我只有在第二次阅读时才明白这一点。为了便于使用,我使用了不同的变量名而不是 Knex
  • 关于实现如何传递初始化的 knex 实例... Monkeypatching 变量到所需的模块非常讨厌,如果更新 knex 甚至可能会导致问题。编写自己的模块会更干净,该模块使用正确的配置初始化 knex 的单例实例。或者只是将 knex 实例传递给应用程序的所有需要​​它的部分。
  • Knex 不会自动退出,所以进程会保持打开状态,您有什么建议?
猜你喜欢
  • 2014-12-22
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多