【问题标题】:How to ensure connection.end() is called when obtaining a database connection from a pool从池中获取数据库连接时如何确保调用connection.end()
【发布时间】:2013-06-25 12:04:27
【问题描述】:

我们正在使用 node-mysql 并且我正在公开 mysql 的 createPool 从任何文件中,我们可以要求数据库文件并获得这样的连接

var db = ("./database");

db(function(err, connection) {
   //use connection to do stuff
}

我注意到人们并不总是记得调用 connection.end() 将连接返回到池,然后我们达到了限制..

如何设计连接的获取,以便无论何时他们决定终止调用 connection.end() 的回调函数?我想不出一种方法来建立一个我们可以做到这一点的地方,所以开发人员只关心获得连接..

【问题讨论】:

    标签: node.js express connection-pooling node-mysql


    【解决方案1】:

    我不知道mysql中的createPool,但是不能直接包装一下吗?

    人们将提供function stuff(err, connection) { ... do whatever they want ... }。 你为什么不使用那个函数并创建一个save_stuff-function?类似的东西

    function save_stuff_creator(stuff) {
        return function(err, connection) { stuff(err, connection); connection.end() }
    }
    

    您可能想要在stuff()-call 周围添加一些try..catch

    如果您希望connection 与某人一起进行其他回调,您可以将函数修改为stuff(connection, callback) 之类的东西,并使用async 之类的模块和series-Object。

    但我不知道如果你想等待“用户线程”结束,如何强制执行connection.end()的最终调用:这实际上是问题所在。没有这样的线程,也无法确定事件循环中的哪个事件来自谁。据我所知,事件循环没有暴露给 js-developer。

    如果你不能信任你的被调用者,也许你可以把他的代码放在一个额外的子节点中(见模块cluster。所以你有一点控制权:当孩子完成时你会收到通知。

    【讨论】:

      猜你喜欢
      • 2011-05-28
      • 2022-12-10
      • 2013-04-25
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2018-12-24
      相关资源
      最近更新 更多