2014-08-27 29 views
0

我使用node-mysql与池连接来处理数据库的东西。一切都很好,但连接的方式被释放。看来connection.release()需要在任何时候打电话事件将要结束。这非常不方便,也使我的代码更加丑陋。太多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(); 
    }); 
}); 

我觉得这个问题是如此真实。我怎样才能避免它?

+0

这将需要重构你的代码。重构您的代码,以尽量减少每个函数的返回次数。这也会减少你的conn.release()调用。 – Guanxi 2014-08-27 17:24:05

+0

如果我的每个“if(!value)”语句都是异步函数,会发生什么情况。每个回调都包含一个'error'参数。如何实施重构? – user3925697 2014-08-27 17:47:02

回答

0

只是括在try语句代码,然后把最后用conn.release块:

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(); } 
}); 

finally块将要执行什么发生(与System.Exit的除外)