不要怂,就是干,撸起袖子干!

Commit 7bd2a19e by Sascha Depold

use the connector-manager to query the database

1 parent 5b09f61a
var Query = require("./query")
, without = function(arr, elem) { return arr.filter(function(e) { return e != elem }) }
var ConnectorManager = module.exports = function(config) { var ConnectorManager = module.exports = function(config) {
this.client = null this.client = null
this.config = config this.config = config
this.clientRequests = 0
this.disconnectTimeoutId = null this.disconnectTimeoutId = null
this.queue = []
this.activeQueue = []
this.maxConcurrentQueries = (this.config.maxConcurrentQueries || 50)
} }
ConnectorManager.prototype.connect = function() { ConnectorManager.prototype.connect = function() {
...@@ -16,44 +21,83 @@ ConnectorManager.prototype.connect = function() { ...@@ -16,44 +21,83 @@ ConnectorManager.prototype.connect = function() {
database: this.config.database database: this.config.database
}) })
this.client.setMaxListeners(999) this.client.setMaxListeners(1000000)
}
ConnectorManager.prototype.query = function(sql, callee, options) {
if(!this.isConnected) this.connect()
var queueItem = {
query: new Query(this.client, callee, options || {}),
sql: sql
}
this._enqueue(queueItem)
return queueItem.query
} }
ConnectorManager.prototype.disconnect = function() { ConnectorManager.prototype.disconnect = function() {
this.client.end() this.client.end(function() {})
} }
ConnectorManager.prototype.reconnect = function() { ConnectorManager.prototype.reconnect = function() {
this.clientRequests = 0
this.disconnect() this.disconnect()
this.connect() this.connect()
} }
ConnectorManager.prototype.afterQuery = function() { // private
this.clientRequests++
ConnectorManager.prototype._enqueue = function(queueItem) {
if(this.activeQueue.length < this.maxConcurrentQueries) {
this.activeQueue.push(queueItem)
this._execQueueItem(queueItem)
} else {
this.queue.push(queueItem)
}
}
ConnectorManager.prototype._dequeue = function(queueItem) {
this.activeQueue = without(this.activeQueue, queueItem)
}
ConnectorManager.prototype._transferQueuedItems = function(count) {
for(var i = 0; i < count; i++) {
var queueItem = this.queue[0]
if(queueItem) {
this._enqueue(queueItem)
this.queue = without(this.queue, queueItem)
}
}
}
this._reconnectIfTooManyConnections() ConnectorManager.prototype._afterQuery = function(queueItem) {
var self = this
this._dequeue(queueItem)
this._transferQueuedItems(this.maxConcurrentQueries - this.activeQueue.length)
this._disconnectIfNoConnections() this._disconnectIfNoConnections()
} }
ConnectorManager.prototype.__defineGetter__('tooManyRequests', function() {
return (this.clientRequests > 50) ConnectorManager.prototype._execQueueItem = function(queueItem) {
}) var self = this
queueItem.query
.on('success', function(){ self._afterQuery(queueItem) })
.on('failure', function(){ self._afterQuery(queueItem) })
queueItem.query.run(queueItem.sql)
}
ConnectorManager.prototype.__defineGetter__('hasNoConnections', function() { ConnectorManager.prototype.__defineGetter__('hasNoConnections', function() {
return this.client._queue && (this.client._queue.length == 0) return (this.queue.length == 0) && (this.activeQueue.length == 0) && this.client._queue && (this.client._queue.length == 0)
}) })
ConnectorManager.prototype.__defineGetter__('isConnected', function() { ConnectorManager.prototype.__defineGetter__('isConnected', function() {
return this.client != null return this.client != null
}) })
// private
ConnectorManager.prototype._reconnectIfTooManyConnections = function() {
this.tooManyRequests && this.reconnect()
}
ConnectorManager.prototype._disconnectIfNoConnections = function() { ConnectorManager.prototype._disconnectIfNoConnections = function() {
var self = this var self = this
......
var Utils = require("./utils") var Utils = require("./utils")
, ModelDefinition = require("./model-definition") , ModelDefinition = require("./model-definition")
, Query = require("./query")
, DataTypes = require('./data-types') , DataTypes = require('./data-types')
var Sequelize = module.exports = function(database, username, password, options) { var Sequelize = module.exports = function(database, username, password, options) {
...@@ -39,21 +38,13 @@ var instanceMethods = { ...@@ -39,21 +38,13 @@ var instanceMethods = {
}, },
query: function(sql, callee, options) { query: function(sql, callee, options) {
options = options || {} options = options || {}
if(this.options.queryOptions) options = Sequelize.Utils.merge(options, this.options.queryOptions) if(this.options.queryOptions) options = Sequelize.Utils.merge(options, this.options.queryOptions)
if(!this.connectorManager.isConnected) this.connectorManager.connect()
options.logging = this.options.hasOwnProperty('logging') ? this.options.logging : true options.logging = this.options.hasOwnProperty('logging') ? this.options.logging : true
var self = this return this.connectorManager.query(sql, callee, options)
, query = new Query(this.connectorManager.client, callee, options).run(sql)
query
.on('success', function(){ self.connectorManager.afterQuery() })
.on('failure', function(){ self.connectorManager.afterQuery() })
return query
}, },
sync: function(options) { sync: function(options) {
...@@ -68,9 +59,9 @@ var instanceMethods = { ...@@ -68,9 +59,9 @@ var instanceMethods = {
self.modelManager.models.forEach(function(model) { chainer.add(model.sync(options)) }) self.modelManager.models.forEach(function(model) { chainer.add(model.sync(options)) })
chainer chainer
.run() .run()
.on('success', function() { eventEmitter.emit('success', null) }) .on('success', function() { eventEmitter.emit('success', null) })
.on('failure', function(err) { eventEmitter.emit('failure', err) }) .on('failure', function(err) { eventEmitter.emit('failure', err) })
}) })
return eventEmitter.run() return eventEmitter.run()
} }
......
var client = new (require("mysql").Client)() var client = new (require("mysql").Client)()
var Utils = module.exports = { var Utils = module.exports = {
_: (function() { _: (function() {
var _ = require("underscore"); var _ = require("underscore")
_.mixin(require('underscore.string'));
_.mixin(require('underscore.string'))
_.mixin({ _.mixin({
camelizeIf: function(string, condition) { camelizeIf: function(string, condition) {
var result = string var result = string
...@@ -15,6 +16,7 @@ var Utils = module.exports = { ...@@ -15,6 +16,7 @@ var Utils = module.exports = {
return result return result
} }
}) })
return _ return _
})(), })(),
addEventEmitter: function(_class) { addEventEmitter: function(_class) {
......
...@@ -37,8 +37,8 @@ module.exports = { ...@@ -37,8 +37,8 @@ module.exports = {
assert.eql(true, uNow.getTime() < u.updatedAt.getTime()) assert.eql(true, uNow.getTime() < u.updatedAt.getTime())
exit(function(){}) exit(function(){})
}) })
}, 100) }, 10)
}, 100) }, 10)
}) })
} }
} }
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!