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

我正在询问有关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呢?

在继续之前,请记住,我从来没有使用过,我只是阅读文档,我认为不同之处在文档中解释:

连接是由游泳池懒洋洋地创build的。 如果将池configuration为允许多达100个连接,但只能同时使用5个连接,则只能build立5个连接。 连接也是循环式循环,连接从池的顶部被取出并返回到底部。

而毁灭是这样的

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

所以我把这个连接看作是底层“主”连接池对象的一个​​对象实例。 你创build连接,你可以执行查询。 释放连接时,该连接对象将被清空。 这不是被称为“池”的主要连接。

当您使用发行版时,软件仍然连接到底层数据库。 当您使用销毁时,软件不再连接到数据库。

可以说我有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中,你可以添加东西到对象的原型,并鼓励你,你可以删除你添加的东西。 原始对象仍然存在,即使删除原型上的东西,原始对象也不会被破坏。

看起来,非终止状态是为了保持游泳池的活力,并“循环”连接。 对于一些批量工作来说并不重要。 这是sidorares的答案: https : //github.com/mysqljs/mysql/issues/1486