gpt4 book ai didi

mysql - pool.query() 和 pool.getGetConnection() 在 connection.release() 上有何不同?

转载 作者:可可西里 更新时间:2023-11-01 06:37:06 25 4
gpt4 key购买 nike

据我所知,每个 pool.query() 都会消耗一个连接,并在结束时自动释放。基于对 github issue 的评论.但是使用 pool.getConnection() 执行的嵌套查询呢?

pool.getConnection(function(err, connection) {

// First query
connection.query('query_1', function (error, results, fields) {

// Second query
connection.query('query_2', function (error, results, fields) {

// Release the connection
// DOES THIS ALSO RELEASE query_1?
connection.release();

if (error) throw error;

// you can't use connection any longer here..
});
});
});

UPDATE

这是我在执行嵌套查询时使用事务的代码。

const pool = require('../config/db');

function create(request, response) {
try {

pool.getConnection(function(err, con) {

if (err) {
con.release();
throw err;
}

con.beginTransaction(function(t_err) {

if (t_err) {
con.rollback(function() {
con.release();
throw t_err;
});
}


con.query(`insert record`, [data], function(i_err, result, fields){

if (i_err) {
con.rollback(function() {
con.release();
throw i_err;
});
}


// get inserted record id.
const id = result.insertId;

con.query(`update query`, [data, id], function(u_err, result, fields)=> {

if (u_err) {
con.rollback(function() {
con.release();
throw u_err;
});
}

con.commit(function(c_err){
if (c_err) {
con.release();
throw c_err;
}
});

con.release();

if (err) throw err;

response.send({ msg: 'Successful' });
});
});

});
});

} catch (err) {
throw err;
}
}

我做了很多防御性错误捕获和 con.release() 因为此时我不知道如何正确释放每个处于事件状态的连接。

而且我还假设 pool.getConnection() 中的每个 con.query() 都需要一个连接。

最佳答案

编辑:

连接 就像一根电线,将您的应用程序连接到数据库。每次您 connection.query() 时,您所做的只是沿着那条线路发送一条消息,而不是更换线路。

当您向请求一个连接时,它会为您提供一条它已经存在的“线路”,或者创建一条连接到数据库的新线路。当您release() 一个池连接时,池会回收它,但会保留它一段时间以备您再次需要它。

因此,查询 是连接线上的消息。您可以随心所欲地发送任意多的消息,这只是一根电线。


原始答案

pool.query(statement, callback) 本质上是

const query = (statement, callback) => {
pool.getConnection((err, conn) => {
if(err) {
callback(err);
} else {
conn.query(statement, (error, results, fields) => {
conn.release();
callback(error, results, fields);
});
}
})
}

理想情况下,您不应该像担心往返次数那样担​​心连接问题。您可以在池配置 multipleStatements: true 中启用多个语句来构建您的池,然后利用事务。

BEGIN;
INSERT ...;
SELECT LAST_INSERT_ID() INTO @lastId;
UPDATE ...;
COMMIT;

关于mysql - pool.query() 和 pool.getGetConnection() 在 connection.release() 上有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46945363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com