连接太多。发布

时间:2014-08-27 17:15:50

标签: node.js node-mysql

我正在使用node-mysql与池连接来处理数据库的东西。一切都很好,但连接的发布方式。似乎connection.release()需要在任何时候调用一个事件。这非常不方便,也使我的代码更加丑陋。

db.getConnection(function(error,conn){
    if(error){
         conn.release();
         throw error;
    }
    conn.query(query1,value1,function(err,result){
         if(err){
              conn.release();
              throw err;
         }
         if(!value1){
             return conn.release();
         }
         // do something here
         if(!value2){
             return conn.release();
         }
         // do something here
         ...
         ...
         ...
         if(!valueN){
             return conn.release();
         }
         // do something here
         conn.release();
    });
    conn.query(query2,value2,function(err,result){
         if(err){
              conn.release();
              throw err;
         }
         if(!value1){
             return conn.release();
         }
         // do something here
         if(!value2){
             return conn.release();
         }
         // do something here
         ...
         ...
         ...
         if(!valueN){
             return conn.release();
         }
         // do something here
         conn.release();
    });
    ...
    ...
    ...
    conn.query(queryN,valueN,function(err,result){
         if(err){
              conn.release();
              throw err;
         }
         if(!value1){
             return conn.release();
         }
         // do something here
         if(!value2){
             return conn.release();
         }
         // do something here
         ...
         ...
         ...
         if(!valueN){
             return conn.release();
         }
         // do something here
         conn.release();
    });
});

我觉得这个问题是如此真实。我怎么能避免呢?

1 个答案:

答案 0 :(得分:0)

将代码放在try语句中,然后使用conn.release:

放入finally块
conn.query(query1,value1,function(err,result){

    try {
     if(err){
          throw err;
     }
     if(!value1){
         return;
     }
     // do something here
     if(!value2){
         return;
     }
     // do something here
     ...
     ...
     ...
     if(!valueN){
         return;
     }
   }
   finally { conn.release(); }
});

最终阻止将被执行(无论System.Exit除外)