2014-08-27 27 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的除外)