Last Updated: February 25, 2016
·
4.335K
· xandout

Prevent node-mysql connection closed error

I have been using nodemon and forever to keep my MySQL backed Node.js app running. I had a small issue where the app would crash after 24-36 hours with MySQL closing the connection. I just assumed it was due to poor coding on my part but didn't really know where my mistake was until now......

exports.getData = function getData(what, callback) {
    pool.getConnection(function(err, connection) {
        connection.on('error', function(err) {
            console.log(err); // 'ER_BAD_DB_ERROR'
        });
        var sql = "SELECT * FROM table WHERE column = '" + what + "'";
        connection.query(sql, function(err, rows) {
            connection.on('error', function(err) {
                console.log(err); // 'ER_BAD_DB_ERROR'
            });
            callback(rows);
        });
        connection.release();
    });
}

This code works, not all the time but 99% of the time it works great.

The problem as it turns out is where I was releasing the connection....

exports.getData = function getData(what, callback) {
    pool.getConnection(function(err, connection) {
        connection.on('error', function(err) {
            console.log(err); // 'ER_BAD_DB_ERROR'
        });
        var sql = "SELECT * FROM table WHERE column = '" + what + "'";
        connection.query(sql, function(err, rows) {
            connection.on('error', function(err) {
                console.log(err); // 'ER_BAD_DB_ERROR'
            });
            connection.release(); //Here is where it should be.
            callback(rows);
        });
        //Not Here
    });
}

I was calling back to other functions, which sometimes themselves where callbacks or would do other long-running tasks and never releasing the connection.

Since I had a pool of connections I should have been releasing the connection when I was done with it......imagine that.

** TL;DR **
Always put your toys up when you are done with them.

1 Response
Add your response

Great article, thanks :D

over 1 year ago ·

Have a fresh tip? Share with Coderwall community!

Post
Post a tip
Did you know?

JavaScript on a page runs with the privileges of that origin. One altered library, tag manager, or snippet can read inputs, change what people see, and call your APIs as the user.

Security insights from Cside