我在问https://github.com/mysqljs/mysql。我有点疑惑destroy
和release
在实践中的区别。考虑这样的代码:
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
的用途是什么?
答案 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