Hướng dẫn how do i close a node connection in mysql? - làm cách nào để đóng kết nối nút trong mysql?

Hiện đang sử dụng: https://github.com/felixge/node-mysql

Tôi có mã sau:

var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'me',
    password : 'secret',
    database : 'Database1'
});
app.put('/api/upload', function(req, res, next)
{
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

Yêu cầu đặt hoạt động hoàn toàn tốt, nhưng gọi nó là lần thứ hai, tôi gặp lỗi sau

events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)

Tôi có nên để kết nối mở cho đến khi máy chủ chết không?

Cập nhật: Khi tôi di chuyển

events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)
4 vào chức năng yêu cầu đặt như vậy:

var connection = null; 
app.put('/api/upload', function(req, res, next)
{
    connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'me',
        password : 'secret',
        database : 'Database1'
    });
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

Nó hoạt động tốt. Điều này có nghĩa là

events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)
5 đóng những gì
events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)
4 đã tạo và không thể kết nối lại?

Ken Ingram

unread,

Ngày 13 tháng 12 năm 2019, 1:16:06 PM12/13/1912/10/19

đến nút-mysql

Cần gì để thực sự có một cuộc trò chuyện dẫn đến việc tôi giải quyết vấn đề của mình?

Tài liệu không cung cấp bất kỳ cái nhìn sâu sắc nào về lý do tại sao tôi không thể đóng kết nối của mình mà không gặp lỗi này:

Tôi tạo kết nối của mình như thế này:

var connection = mysql.createConnection({
    //debug: ['ComQueryPacket'],
    host        : dataSource.host,
    user        : dataSource.user,
    password: dataSource.password,
    database: dataSource.database
});

Tôi có ba chức năng tạo ra các truy vấn cơ sở dữ liệu.

Hàm chứa truy vấn chọn được xây dựng như thế này:

dbSearch(data){
  var sql = "SELECT * from table where field =? and otherfield=?";
  return new Promise((resolve, reject) => {
    connection.query(sql, [data[0], data[1], (error, results, fields) => {
        if (error){
          console.log(error);
          reject("Database connection error: " + error);
         } else {
          resolve(results);
         }  
    });
  });
}

Mã thực thi trong một chức năng khác:

if (dataItem){
  dbSearch(dataItem)
    .then((row) => {
        processingfunction(row);
    });

Nếu tôi bỏ kết nối.end (), mã bị treo và luồng dữ liệu được giữ tại mục đầu tiên được xử lý.

Nếu tôi đặt Connection.end () bên trong hàm, tôi sẽ gặp lỗi này:

Lỗi kết nối cơ sở dữ liệu: Lỗi: Không thể truy vấn enqueue sau khi gọi thoát.

Tôi đặt Connection.end () làm dòng cuối cùng của mã, mọi thứ đều hoạt động tốt

Vấn đề mặc dù là cho các chức năng cập nhật và chèn:

updateRecord(data){
  var sql = "UPDATE table set field=? where id=?";
  return new Promise((resolve, reject) => {
    connection.query(sql, [data[0], data[1], (error, results, fields) => {
     if (error){
      console.log(error);
      reject("Database connection error: " + error);
     } else {
      resolve(results);
     }
    });
  });
}

inputRecord(data){
  var sql = "INSERT INTO table (field1, field2, field3) VALUES(?,?,?)";
  return new Promise((resolve, reject) => {
    connection.query(sql, [data[0], data[1], data[2]], (error, results, fields) => {
      if (error){
        console.log(error);
        reject("Database connection error: " + error);
      } else {
        resolve(results);
      } 
    });
  });
}

Với Connection.end () trong hàm tôi gặp lỗi này.

Database connection error: Error: Cannot enqueue Query after invoking quit.
(node:40700) UnhandledPromiseRejectionWarning: Database connection error: Error: Cannot enqueue Query after invoking quit.
(node:40700) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:40700) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Dựa trên tài liệu, tôi không có sự rõ ràng về cách xử lý đúng cách đóng kết nối để mã có thể xử lý đúng.

Không chắc tôi đang làm gì sai. Có thể sử dụng một số MentorInng từ một người có kinh nghiệm sử dụng các kết nối để xử lý các khối dữ liệu và cách xử lý đúng cách đóng các kết nối?

Lưu ý: & nbsp; Một vấn đề tương tự xảy ra khi tôi thử gộp kết nối, vì vậy đó không phải là một giải pháp khả thi. A similar problem happens when I try connection pooling, so that was not a workable solution.

Ryan Lee

unread,

Ngày 10 tháng 12 năm 2019, 4:10:59 PM12/10/1912/10/19

đến

  1. Dữ liệu của bạn bạn đang cố tải lớn như thế nào? Nếu bạn cố gắng tải đến bộ dữ liệu lớn, trình thông dịch Node.js & nbsp; sẽ bị sặc. Bạn sẽ cần sử dụng API phát trực tuyến cho các bộ dữ liệu lớn hơn. Để kiểm tra lý thuyết này, hãy ném giới hạn vào các truy vấn chọn của bạn và xem đó có phải là vấn đề không.
  2. Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa ​​hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:

sự liên quan

& nbsp; .queryasync ("Chọn * từ blah") // chức năng này được phơi bày như một phần của lời hứa của Blubird & nbsp;

& nbsp; .each ((hàng) => {& nbsp; // bluebird's mỗi cho phép bạn lặp qua hàng của mình theo thứ tự tuần tự

& nbsp; & nbsp; & nbsp; return kết nối.queryasync ("Chèn vào bộ fubar?", formatedrow) & nbsp; // mà bây giờ bạn có thể hoạt động trên mỗi hàng theo thứ tự

& nbsp; })

& nbsp; .fally (() => {

& nbsp; & nbsp; Connection.end (); & nbsp; });
  });

Và nếu bạn cảm thấy thực sự bẩn, bạn luôn có thể xử lý.exit ()process.exit()

dbSearch(dataItem)
    .then((row) => { //remember this might an array of rows.
        return processingfunction(row); //return a promise here
    }).then(() => {
       connection.end(); //close the connection after you've run all your queries
    });

--Ryan


Tôi đang sử dụng mysqljs để truy cập MySQL với JavaScript.

Tôi muốn chỉ ra rằng quá trình này dường như hoạt động tốt nếu một phần dữ liệu duy nhất. Tôi đang cung cấp cho mã của mình một bộ dữ liệu lớn, để được xử lý theo dòng dưới dạng một lô.

Làm thế nào lớn? Nếu bạn đang nói nhiều dữ liệu, bạn cần truyền phát khi bạn hết bộ nhớ trong luồng JS của mình. & NBSP;

Làm thế nào bạn phát trực tuyến dữ liệu? & Nbsp;

Ken Ingram

unread,

Ngày 10 tháng 12 năm 2019, 7:22:25 PM12/10/1912/10/19

đến

  1. Dữ liệu của bạn bạn đang cố tải lớn như thế nào? Nếu bạn cố gắng tải đến bộ dữ liệu lớn, trình thông dịch Node.js & nbsp; sẽ bị sặc. Bạn sẽ cần sử dụng API phát trực tuyến cho các bộ dữ liệu lớn hơn. Để kiểm tra lý thuyết này, hãy ném giới hạn vào các truy vấn chọn của bạn và xem đó có phải là vấn đề không.

Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa ​​hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:
At most 50 lines of data need update or insert.

  1. Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa ​​hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:

sự liên quan

& nbsp; .queryasync ("Chọn * từ blah") // chức năng này được phơi bày như một phần của lời hứa của Blubird & nbsp;

& nbsp; .each ((hàng) => {& nbsp; // bluebird's mỗi cho phép bạn lặp qua hàng của mình theo thứ tự tuần tự

& nbsp; & nbsp; & nbsp; return kết nối.queryasync ("Chèn vào bộ fubar?", formatedrow) & nbsp; // mà bây giờ bạn có thể hoạt động trên mỗi hàng theo thứ tự

& nbsp; })

& nbsp; .fally (() => {

& nbsp; & nbsp; Connection.end (); & nbsp; });
  });

Và nếu bạn cảm thấy thực sự bẩn, bạn luôn có thể xử lý.exit ()

Và nếu bạn cảm thấy thực sự bẩn, bạn luôn có thể xử lý.exit ()process.exit()

dbSearch(dataItem)
    .then((row) => { //remember this might an array of rows.
        return processingfunction(row); //return a promise here
    }).then(() => {
       connection.end(); //close the connection after you've run all your queries
    });

--Ryan


Tôi đang sử dụng mysqljs để truy cập MySQL với JavaScript.
 . Or Ol' Dirty Kenstard

Tôi muốn chỉ ra rằng quá trình này dường như hoạt động tốt nếu một phần dữ liệu duy nhất. Tôi đang cung cấp cho mã của mình một bộ dữ liệu lớn, để được xử lý theo dòng dưới dạng một lô.

Ken Ingram

unread,

Ngày 10 tháng 12 năm 2019, 7:22:25 PM12/10/1912/10/19

đến


  1. Dữ liệu của bạn bạn đang cố tải lớn như thế nào? Nếu bạn cố gắng tải đến bộ dữ liệu lớn, trình thông dịch Node.js & nbsp; sẽ bị sặc. Bạn sẽ cần sử dụng API phát trực tuyến cho các bộ dữ liệu lớn hơn. Để kiểm tra lý thuyết này, hãy ném giới hạn vào các truy vấn chọn của bạn và xem đó có phải là vấn đề không.

Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa ​​hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:
At most 50 lines of data need update or insert.

  1. Bạn đang điều khiển các truy vấn của mình như thế nào? Hãy nhớ MySQL là đồng bộ & nbsp; và js là async. Nếu truy vấn thứ hai của bạn dựa vào truy vấn đầu tiên để hoàn thành trước, bạn có thể treo. Bạn cần phải "hứa ​​hẹn chuỗi" chúng. Tôi hoàn toàn giới thiệu Bluebird cho điều này. Bạn không cần phải đối phó với tất cả các gói tự mình. Kiểm tra nó:

Các truy vấn là độc lập. Chèn và cập nhật tồn tại trong vũ trụ của riêng họ.

Và nếu bạn cảm thấy thực sự bẩn, bạn luôn có thể xử lý.exit ()process.exit()

dbSearch(dataItem)
    .then((row) => { //remember this might an array of rows.
        return processingfunction(row); //return a promise here
    }).then(() => {
       connection.end(); //close the connection after you've run all your queries
    });

--Ryan

Đáng buồn thay, bất kỳ nỗ lực nào để đóng thủ công kết nối kết nối

Xử lý hoàn thành +++++++++++++++++++++++++++++++++++> & NBSP; sự kiện.js: 174 & nbsp; & nbsp; & nbsp; người giao cầu; // không xử lý 'lỗi' sự kiện & nbsp; & nbsp; & nbsp; ^
  events.js:174
      throw er; // Unhandled 'error' event
      ^

Lỗi: Không thể bỏ thuốc sau khi gọi QUIT. & NBSP; & nbsp; tại giao thức._ValidateEnqueue (Project \ Node \ node_modules \ mysql \ lib \ protucol \ protucol.js: 215: 16) & nbsp; & nbsp; tại giao thức._enqueue (Project \ Node \ node_modules \ mysql \ lib \ protocol \ protucol.js: 138: 13) & nbsp; & nbsp; tại giao thức.quit (Project \ Node \ node_modules \ mysql \ lib \ Protocol \ protucol.js: 91: 23) & nbsp; & nbsp; tại Connection.end (Project \ Node \ node_modules \ mysql \ lib \ Connection.js: 242: 18) & nbsp; & nbsp; Tại CheckRecord.then.Finally (Project \ Node \ Utility.js: 302: 32)
    at Protocol._validateEnqueue (project\node\node_modules\mysql\lib\protocol\Protocol.js:215:16)
    at Protocol._enqueue (project\node\node_modules\mysql\lib\protocol\Protocol.js:138:13)
    at Protocol.quit (project\node\node_modules\mysql\lib\protocol\Protocol.js:91:23)
    at Connection.end (project\node\node_modules\mysql\lib\Connection.js:242:18)
    at checkRecord.then.finally (project\node\utilities.js:302:32)

Ken Ingram

unread,

Ngày 13 tháng 12 năm 2019, 1:16:06 PM12/13/1912/13/19

đến nút-mysql

Cần gì để thực sự có một cuộc trò chuyện dẫn đến việc tôi giải quyết vấn đề của mình?

Tài liệu không cung cấp bất kỳ cái nhìn sâu sắc nào về lý do tại sao tôi không thể đóng kết nối của mình mà không gặp lỗi này:

CẬP NHẬT THEDATA SET FIELD = 'Thông tin' trong đó objid = 1234

{Lỗi: nhóm được đóng lại.

Tại pool.getConnection (Project \ Node \ node_modules \ mysql \ lib \ pool.js: 25: 15)

Tại Promise (Project \ Node \ Utility.js: 506: 8)

tại New Promise ()

Tại ExecuteQuery (Project \ Node \ Utility.js: 505: 9)

Tại UpdateRecord (Project \ Node \ Utility.js: 479: 9)

Tại ProcessRecord (Project \ Node \ Utility.js: 443: 12)

Tại CheckRecord.Then (Project \ Node \ Utility.js: 301: 12)

Tại Process._TickCallback (Internal/Process/next_tick.js: 68: 7) Mã: 'pool_closes'}

Bể bơi được phát hành.

Bể bơi được phát hành.

Theo lời khuyên của bạn, tôi đã điều chỉnh mã của mình:

checkRecord(data)

.then ((hàng) => {

//console.log(JSON.stringify(row));

return ProcessRecord (hàng [0], hàng [1], đầu vào);

// for (var i = 0; i

// console.log (cơ sở dữ liệu_changes.join ("','"));console.log(database_changes.join("','"));

//}

})

.then(()=>{

pool.end((err)=>{

if (err) ném err;

Console.log ("Bể bơi phát hành.");

Ken Ingram

unread,

Ngày 13 tháng 12 năm 2019, 1:16:06 PM12/13/1912/13/19

đến nút-mysql

Cần gì để thực sự có một cuộc trò chuyện dẫn đến việc tôi giải quyết vấn đề của mình?
I'm still not very sophisticated with async programming, and in particular the idiosyncracies of Promises.

Tài liệu không cung cấp bất kỳ cái nhìn sâu sắc nào về lý do tại sao tôi không thể đóng kết nối của mình mà không gặp lỗi này:
I have to manually kill the script because the pool is still open.

CẬP NHẬT THEDATA SET FIELD = 'Thông tin' trong đó objid = 1234
(it's looping through an array of input data) is itself returning a promise.
If I end the connection pool any time before the last DML call to the database
completes, the remaining promises will reject due to no connection.

{Lỗi: nhóm được đóng lại.

Ken Ingram

unread,

Ngày 13 tháng 12 năm 2019, 1:16:06 PM12/13/1912/13/19

đến nút-mysql

Cần gì để thực sự có một cuộc trò chuyện dẫn đến việc tôi giải quyết vấn đề của mình?
It was purely how I was returning and handling the promises.

Tài liệu không cung cấp bất kỳ cái nhìn sâu sắc nào về lý do tại sao tôi không thể đóng kết nối của mình mà không gặp lỗi này:
needed to use Promise.all to collect all of the promises and when they
were all fulfilled, or one was rejected, handle pool.end();

Phương pháp đóng kết nối với MySQL là gì?

Phương thức mysqlconnection.close.Đóng kết nối với cơ sở dữ liệu. Close Method. Closes the connection to the database.

Điều gì xảy ra nếu bạn không đóng kết nối MySQL?

Nếu tập lệnh của bạn có một lượng xử lý hợp lý để thực hiện sau khi tìm nạp kết quả và đã truy xuất toàn bộ kết quả, bạn chắc chắn nên đóng kết nối.Nếu bạn không, có khả năng máy chủ MySQL sẽ đạt đến giới hạn kết nối khi máy chủ web đang sử dụng nặng.there's a chance the MySQL server will reach it's connection limit when the web server is under heavy usage.

Tôi có nên đóng kết nối DB sau khi truy vấn không?

Với mục đích mã hóa an toàn, bạn nên luôn đóng các kết nối cơ sở dữ liệu một cách rõ ràng để đảm bảo rằng mã có thể tự đóng một cách duyên dáng và để ngăn chặn bất kỳ đối tượng nào khác sử dụng lại kết nối tương tự sau khi bạn hoàn thành nó.you should always close database connections explicitly to make sure that the code was able to close itself gracefully and to prevent any other objects from reusing the same connection after you are done with it.