在快速应用程序中处理MySQL数据库连接的模式

我正在使用Express 4.x,以及最新的MySQL节点包。

PHP应用程序(我最熟悉的)的模式是有一些数据库连接公用文件被包含在内,连接在脚本完成后自动closures。 在快速应用中实现时,可能看起来像这样:

// 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 }); }); }); 

请原谅缺乏error handling,这是一个原始的例子。 在任何情况下,我的db()函数都会返回将连接到数据库并存储连接对象req.db ,从而有效地为每个请求提供一个新对象。 这个方法有几个问题:

  • 这根本没有规模; 数据库连接(价格昂贵)将以相当便宜的请求进行线性扩展。
  • 数据库连接不会自动closures,并会在未被捕获的错误涓stream的情况下终止应用程序。 你必须捕捉它并重新连接(感觉像一个反模式),或者编写更多的中间件,一切必须调用pior来输出,以确保连接closures(反DRY,可以说)

我见过的下一个模式是在应用程序启动时简单地打开一个连接。

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

与此有关的问题:

  • 仍然不缩放。 一个连接很容易被我的产品盒上的10-20个请求堵塞(1GB-2GB RAM,3.0GHZ四CPU)。
  • 连接将在一段时间后仍然超时,我必须提供一个error handling程序来捕捉它并重新连接 – 非常kludgy。

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

既然,你在NodeJS中谈论MySQL,我不得不把你指向KnexJS ! 你会发现写作查询更有趣。 他们使用的另一件事是连接池,这应该解决您的问题。 它使用了一个名为generic-pool-redux软件包来pipe理诸如数据库连接之类的东西。

这个想法是你有一个地方你的快速应用程序通过代码访问数据库。 事实certificate,这段代码使用连接池来共享连接间的负载。 我初始化这样的东西:

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

在其他文件中

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

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


我确信有Node和MySQL的其他连接池包,但是我个人推荐KnexJS,如果你正在做任何dynamic或复杂的SQL查询。 祝你好运!