当你在连接上调用`release`而不是`destroy`时?

时间:2016-07-20 20:39:44

标签: mysql node.js node-mysql

我在问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的用途是什么?

2 个答案:

答案 0 :(得分:3)

在继续之前,请记住我以前从未使用过这个,我只是阅读了文档,我认为差异在文档中有解释:

  

游泳池懒洋洋地创建了连接。如果将池配置为允许最多100个连接,但只能同时使用5个连接,则只会建立5个连接。连接也循环循环,从池顶部连接并返回底部。

而破坏就是这个

  

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

所以我认为连接就像底层" main"的对象实例一样。连接池对象。您可以创建连接,并可以执行查询。释放连接时,该连接对象将被清空。这不是称为" pool"的主要连接。

使用版本时,软件仍然连接到底层数据库。使用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的特定连接,但我仍然连接到db,因此conn3可以开始执行。

将其视为javascript,您可以将对象添加到对象的原型中,我们鼓励您,并且可以删除您添加的任何内容。原始对象仍然存在,即使您删除原型上的内容,原始对象也不会被破坏。

答案 1 :(得分:0)

如图所示,非终止状态是故意保持池活动,并“循环”连接。对于某些批量工作而言,这并不重要。以下是sidorares的回答:https://github.com/mysqljs/mysql/issues/1486