【问题标题】:When you call `release` instead `destroy` on connection?当您在连接上调用“释放”而不是“销毁”时?
【发布时间】:2016-07-20 20:39:44
【问题描述】:

我在问https://github.com/mysqljs/mysql。我有点困惑destroyrelease 在实践中之间有什么区别。考虑这样的代码:

pool.getConnection(function(err, conn)
{
  if (err)
    throw err;

  console.log("Connected");
  conn.release();
});

这将永远挂起。如果我将release 切换到destroy,程序就会终止。项目页面中的示例有这样一段代码:

connection.release();
// Don't use the connection here, it has been returned to the pool.

所以两者都像终止一样只有release 没有终止。我的问题是——那么release 有什么用呢?

【问题讨论】:

    标签: mysql node.js node-mysql


    【解决方案1】:

    在继续之前,请记住,我以前从未使用过它,我只是阅读了文档,我认为文档中的区别是这样解释的:

    连接是由池延迟创建的。如果您将池配置为最多允许 100 个连接,但只同时使用 5 个,则只会建立 5 个连接。连接也是循环的循环方式,连接从池的顶部取出并返回到底部。

    而destroy是这个

    这将导致底层套接字立即终止。此外,destroy() 保证不会为连接触发更多事件或回调。

    所以我认为连接就像底层“主”连接池对象的对象实例。您创建连接,您可以从中执行查询。当您释放连接时,该连接对象将被清空。这不是称为“池”的主要连接。

    当您使用发布时,软件仍然连接到底层数据库。当您使用destroy 时,软件不再连接到数据库。

    假设我有 5 个连接实例,查询如下

    conn1 => select statement that takes 5 mins. 
    conn2 => execute a procedure that takes 30 mins. 
    conn3 => delete stuff under a min 
    conn4 => nothing 
    conn5 => nothing 
    

    在文档中,很明显池将连接排队,如果我以与上述相同的顺序执行连接语句,conn 3 将在 5 + 30 分钟后执行。如果在第二次连接执行期间,用户点击取消怎么办?然后我会释放 conn2 的特定连接,但我仍然连接到数据库,因此 conn3 可以开始执行。

    把它想象成在 javascript 中你可以向对象的原型中添加东西,我们鼓励你这样做,并且你可以删除你添加的任何东西。原始对象仍然存在,即使您删除原型上的内容,原始对象也不会被破坏。

    【讨论】:

    • 谢谢,你的例子是不正确的,因为如果你有5个连接,而不是1个,那么它们是相互独立的,所以conn3不管你做什么都可以使用conn2。但是你给了我想法——也许release 应该被称为“侧面”(用户取消操作......),而destroy 在主管道中终止连接。我会试着模仿这个......
    • 我只是在举一个愚蠢的例子哈哈哈,但我想你在主管道中说destroy 以终止连接时明白了我的意思。 release:嘿,别再执行了,走开,destroy:所有车道都关闭了,不允许交通,我们关闭了一切。
    【解决方案2】:

    看起来,非终止状态是为了让池保持活动状态,并“循环”连接。对于某些批处理作业,它并不那么重要。这是 sidorares 的答案:https://github.com/mysqljs/mysql/issues/1486

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-10
      • 2016-07-08
      • 2011-07-19
      • 1970-01-01
      • 2013-07-06
      • 2011-02-23
      • 1970-01-01
      • 2015-06-01
      相关资源
      最近更新 更多