From fdb3c57ced4f8f278d013ce49d8d753d306fb097 Mon Sep 17 00:00:00 2001 From: Erik Christensen Date: Mon, 16 Dec 2013 13:06:32 -0800 Subject: [PATCH 1/2] Modify mysql driver to reconnect after timeout --- lib/drivers/mysql.js | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/lib/drivers/mysql.js b/lib/drivers/mysql.js index 11e44f5..a2ed7c5 100644 --- a/lib/drivers/mysql.js +++ b/lib/drivers/mysql.js @@ -4,17 +4,34 @@ module.exports = function MysqlDriver() { return { connect: function connect(opts, callback) { - const conn = mysql.createConnection(opts) - conn.connect(callback) - return conn + function createConnectionInstance(connection, callback) { + connection.instance = mysql.createConnection(opts) + connection.instance.connect(callback) + setErrorHandler(connection) + } + + function setErrorHandler(connection) { + connection.instance.on('error', function(err) { + if (err.code === 'PROTOCOL_CONNECTION_LOST') { + createConnectionInstance(connection) + } + else { + console.error(err) + } + }) + } + + var connection = {} + createConnectionInstance(connection, callback) + return connection }, close: function close(connection, callback) { - return connection.end(callback) + return connection.instance.end(callback) }, getQueryFn: function getQueryFn(connection) { return function (sql, params, callback) { const opts = { sql: sql } - return connection.query(opts, params, callback) + return connection.instance.query(opts, params, callback) } }, getStreamFn: function getStreamFn(connection) { @@ -25,8 +42,8 @@ module.exports = function MysqlDriver() { const queryStream = this.query(sql) const handlers = this.driver.streamHandlers(stream, opts) - stream.pause = connection.pause.bind(connection) - stream.resume = connection.resume.bind(connection) + stream.pause = connection.instance.pause.bind(connection.instance) + stream.resume = connection.instance.resume.bind(connection.instance) queryStream.on('result', handlers.row) queryStream.on('end', handlers.done) From 43603018ab19f4721a9732298e58163a18b47c58 Mon Sep 17 00:00:00 2001 From: Erik Christensen Date: Wed, 18 Dec 2013 20:24:49 -0800 Subject: [PATCH 2/2] First, broken version of pooled mysql connections --- lib/drivers/mysql.js | 68 ++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/lib/drivers/mysql.js b/lib/drivers/mysql.js index a2ed7c5..e9ad6b6 100644 --- a/lib/drivers/mysql.js +++ b/lib/drivers/mysql.js @@ -4,50 +4,62 @@ module.exports = function MysqlDriver() { return { connect: function connect(opts, callback) { - function createConnectionInstance(connection, callback) { - connection.instance = mysql.createConnection(opts) - connection.instance.connect(callback) - setErrorHandler(connection) - } - - function setErrorHandler(connection) { - connection.instance.on('error', function(err) { - if (err.code === 'PROTOCOL_CONNECTION_LOST') { - createConnectionInstance(connection) - } - else { - console.error(err) - } + if (callback) { + process.nextTick(function () { + callback(null) }) } - var connection = {} - createConnectionInstance(connection, callback) - return connection + opts.connectionLimit = 100 + return mysql.createPool(opts) }, - close: function close(connection, callback) { - return connection.instance.end(callback) + close: function close(pool, callback) { + pool.end(callback) }, - getQueryFn: function getQueryFn(connection) { + getQueryFn: function getQueryFn(pool) { return function (sql, params, callback) { const opts = { sql: sql } - return connection.instance.query(opts, params, callback) + + pool.getConnection(function (err, connection) { + if (err) { + if (callback) + return callback(err) + else + return console.error(err) + } + + return connection.query(opts, params, function (err, rows) { + connection.release() + if (callback) callback(err, rows) + }) + }) } }, - getStreamFn: function getStreamFn(connection) { + getStreamFn: function getStreamFn(pool) { // will be in the context of `db` // expected to return a stream return function streamQuery(sql, opts) { const stream = new Stream() - const queryStream = this.query(sql) const handlers = this.driver.streamHandlers(stream, opts) - stream.pause = connection.instance.pause.bind(connection.instance) - stream.resume = connection.instance.resume.bind(connection.instance) + pool.getConnection(function (err, connection) { + if (err) return stream.emit('error', err) + + function endCallback(err) { + connection.release() + handlers.done(err) + } + + const queryStream = connection.query(sql) + + stream.pause = connection.pause.bind(connection) + stream.resume = connection.resume.bind(connection) + + queryStream.on('result', handlers.row) + queryStream.on('end', endCallback) + queryStream.on('error', stream.emit.bind(stream, 'error')) + }) - queryStream.on('result', handlers.row) - queryStream.on('end', handlers.done) - queryStream.on('error', stream.emit.bind(stream, 'error')) return stream } },