Как автоматически закрыть соединение mysql в nodejs

В настоящее время мой процесс висит, потому что пул mysql не закрывается автоматически.

Я предположил, что когда я позвоню connection.release() соединение будет закрыто, если никто другой его не использует. Но, похоже, это не так. Мой код выглядит так:

getConnection.js:

var mysql = require('mysql');

var pool = mysql.createPool({
 connectionLimit : 10,
 host : 'localhost',
 user : 'root',
 password : 'mysql',
 database : 'xxx'
});

module.exports = function getConnection(callback){
 pool.getConnection(function(err, connection){
 if (err) {
 throw err;
 }
 callback(connection);
 });
}

И я использую его вот так:

var getConn = require('./getConnection');

function selectOne(query, map, cb){

 getConn(function(conn){
 conn.query(query, map, function(err, rows){
 if (err) {
 throw err;
 }

 cb(rows.length ? rows[0] : false);
 conn.release();
 });
 });
}

Кажется, я что-то упускаю. Должно ли node-mysql закрыть соединение для меня, когда я его выпустил?

3 ответа

От https://github.com/felixge/node-mysql#pooling-connections conn.release(); позволяет подключиться к пулу подключений, чтобы он не закрывал его. Если вы хотите закрыть соединение, используйте conn.end(); согласно документам: https://github.com/felixge/node-mysql#terminating-connections.


Я придерживался аналогичного подхода, как Ишаан, но я считаю, что для вас это немного чище.

вот фрагмент моего кода.

// Dependencies
var mysql = require('mysql'),
 config = require("../config");

/*
 * @sqlConnection
 * Creates the connection, makes the query and close it to avoid concurrency conflicts.
 */
var sqlConnection = function sqlConnection(sql, values, next) {

 // It means that the values hasnt been passed
 if (arguments.length === 2) {
 next = values;
 values = null;
 }

 var connection = mysql.createConnection(config.db);
 connection.connect(function(err) {
 if (err !== null) {
 console.log("[MYSQL] Error connecting to mysql:" + err+'\n');
 }
 });

 connection.query(sql, values, function(err) {

 connection.end(); // close the connection

 if (err) {
 throw err;
 }

 // Execute the callback
 next.apply(this, arguments);

 });
}

module.exports = sqlConnection;

Чем вы можете использовать его в любом месте, просто делая

var mysql_query = require('../models/mysql_query');
mysql_query('SELECT * from your_table where ?', {id: '1'}, function(err, rows) {
 console.log(rows);
});

Надеюсь это поможет.


Я здесь очень новый, поэтому простите меня, если я ошибаюсь.

Вот как я это делаю

module.exports = {
 getDBConnection: function () {
 return mysql.createConnection(config.db);
 },

 connectToDB: function (connection) {
 connection.connect(function (err) {
 if (err) {
 throw err;
 }
 });
 },

 endDBConnection: function (connection) {
 connection.end(function (err) {
 if (err) {
 throw err;
 }
 });
 },

 exec: function (query, data, cb) {
 var connection = this.getDBConnection();
 this.connectToDB(connection);
 connection.query(query, data, function(err, res) {
 if (err) {
 cb(err);
 }
 cb(null, res);
 });
 this.endDBConnection(connection);
 }
}

это переменная конфигурации

db: {
 host: 'localhost',
 user: 'root',
 password: '',
 database: 'test'
},

licensed under cc by-sa 3.0 with attribution.