2014-10-01 138 views
0

我有一个我写的从Restful web服务获取数据的网站。 Restful Web服务使用node-mysql从node.js和MySQL运行。我遇到的问题是连接耗尽。例如,我的默认页面会执行一堆查找来获取数据。在该页面的第9次刷新中,我对Restful API的查找之一会引发此错误“没有可用的连接”。Node.js应用程序的连接池“没有可用的连接”

这里是怎么样的东西在宁静的API侧架构:

在server.js:

var db = require('mysql'); 
var db_pool = db.createPool(
{ 
    host : 'localhost', 
    connectionLimit: 100, 
    supportBigNumbers: true, 
    waitForConnections: false 
}); 

setRoutes(server, db_pool, passport, LocalStrategy, jwt, tokenSecret, bcrypt); 

在router.js:

setRoutes = function(server, connectionPool, passport, LocalStrategy, jwt, tokenSecret, bcrypt) 
{ 
    require('./lib/places.js'); 
    place.connectionPool = connectionPool; 
} 

server.get('api/place/:id', function(request, response) 
{ 
    response.header("Access-Control-Allow-Origin", "*"); 
    response.header("Access-Control-Allow-Headers", "X-Requested-With"); 

    place.get(request.params.id, function(err, data) 
    { 
     response.send(data); 
     next(); 
    }); 
}); 

最后,在places.js中:

place.connectionPool = null; 

place.get = function(id, callback) 
{ 
    place.connectionPool.getConnection(function(error, connection) 
    { 
     var query = "select myColumn from myTable"; 

     connection.query 
     (
      query, 
      function (queryError, rows, fields) 
      { 
       try {connection.release();} catch(e){}; 

       if (queryError) 
       { 
        console.log(JSON.stringify(queryError)); 
        return (callback(null, queryError)); 
       } 

       return (callback(null, rows)); 
      } 
     ); 
    }); 
} 

为网站实现node-mysql和连接池的最佳做法是什么?

谢谢!

+1

'place.connectionPool = null; place.connectionPool.getCo ...'有什么意义? – 2014-10-01 21:55:57

+0

好问题 - 在places.js的头文件/全局属性中,我实例化了place.connectionPool = null。我的假设是,当从server.js调用setRoutes时,connectionPool将被填充在server.js中创建的池中。 place.connectionPool.getConnection实际上是一个从router.js中的路由中调用的函数。那有意义吗? – 2014-10-01 22:18:54

回答

0

解决了连接问题 - 我没有在所有正在进行回调的地方发布连接。