2012-10-09 174 views
2

我有c3p0連接池的問題,我是新的c3p0。c3p0連接池充分事件連接關閉時關閉

我的桌面程序中使用的Java與MSSQL 2008R2 JDBC驅動程序我用的是JTDS 和連接池,我使用C3P0

我有當程序運行一段時間的一些問題,該程序被卡住因爲它正在等待從池中獲得連接。

看來連接池已滿,因此sql語句無法執行。 我每次完成執行sql語句時都已關閉連接。

沒有人有c3p0這個相同的問題?

說明: 我使用ComboPooledDataSource,當我想獲得一些連接時,我使用ComboPooledDataSource,getConnection()方法。來自ComboPooledDataSource的這個getConnection()方法,它是否獲得空閒連接?

如何使連接閒置?因爲我每次獲得連接時都已關閉連接。

謝謝。

這是我使用的代碼: 一般我有2類:1.對於 數據庫連接(獲取連接和池)2.對於數據庫事務 (執行查詢語句)

public final class DBConnection { 
private static DatabaseProperties dbProp; 
private static ComboPooledDataSource ds; 

private DBConnection(){} 

private static void create(){ 
    DatabaseProperties dp = getDatabaseProperties(); 
    boolean success = true; 

    do{ 
     try{ 
      ds = new ComboPooledDataSource(); 
      ds.setDriverClass("net.sourceforge.jtds.jdbc.Driver"); 
      ds.setJdbcUrl("jdbc:jtds:sqlserver://"+ dp.getIpaddr()+":"+dp.getPort()+ "/"+dp.getDbname();); 
      ds.setUser(dp.getUsername()); 
      ds.setPassword(dp.getPassword()); 

      ds.setMinPoolSize(3); 
      ds.setAcquireIncrement(1); 
      ds.setMaxPoolSize(20); 
     } catch (Exception ex) { 
      LoggerController.log(Level.SEVERE,"Database error on creating connection",ex,LoggerController.DATABASE); 
      success = false; 
     } 
    }while(!success); 
} 
public static ComboPooledDataSource getDataSource(){ 
    if(ds == null)create(); 

    return ds; 
} 

public static Connection getConnection(){ 
    Connection con = null; 
    try { 
     con = DBConnection.getDataSource().getConnection(); 
    } catch (SQLException ex) { 
     LoggerController.log(Level.SEVERE,"Database error on getting connection",ex,LoggerController.DATABASE); 
    } 

    return con; 
} 

public static void close(){ 
    ds.close(); 
} 

}

public class DBTrans { 
private DBTrans(){} 

public static DataTable executeQuery(String query) throws SQLException{ 
    DataTable dt = null; 
    Connection con = null; 
    try { 
     con = DBConnection.getConnection(); 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery(query); 
     dt = new DataTable(rs); 
    } catch (SQLException ex) { 
     throw new SQLException("QUERY= ["+query+"]\n"+ex.getMessage()); 
    } 
    finally{ 
     if(con!=null){ 
      con.close(); 
     } 
    } 
    return dt; 
} 

public static int executeUpdate(String query) throws SQLException{ 
    int sql = 0; 
    Connection con = null; 
    try { 
     con = DBConnection.getConnection(); 
     Statement stmt = con.createStatement(); 
     sql = stmt.executeUpdate(query); 
     con.close(); 
    } catch (SQLException ex) { 
     throw new SQLException("QUERY=["+query+"]\n"+ex.getMessage()); 
    } 
    finally{ 
     if(con!=null){ 
      con.close(); 
     } 
    } 
    return sql; 
} 

}

+0

是否有異常痕跡? – Santosh

+0

nope,該程序只是卡住,等待連接。 – Pichanz

+0

你有調試/分析你的程序嗎? – Alfabravo

回答

2

給你展示的代碼,最終你的應用程可能會泄漏Connections,導致連接池耗盡(也就是說,所有連接都被不可撤銷地檢出)。您需要始終使用強大的資源清理方法。參見例如

http://old.nabble.com/Re:-My-connections-are-all-idle...-p27691635.html

一旦你修改代碼以可靠的連接COSE,如果你仍然看到問題,C3P0有設置查找和調試未歸還連接。您可以暫時設置unreturnedConnectionTimeout並使用debugUnreturnedConnectionStackTraces跟蹤泄漏。見

http://www.mchange.com/projects/c3p0/index.html#unreturnedConnectionTimeout

http://www.mchange.com/projects/c3p0/index.html#debugUnreturnedConnectionStackTraces

但首先,剛修好你的資源清理代碼,看看問題是否會消失。捕獲debugUnreturnedConnectionStackTraces是一種性能拖延;顧名思義,它應該只用於臨時調試。

我希望這有助於!

+0

嗯..我已經關閉連接使用最後的聲明,作爲您的鏈接給出。足夠可靠嗎? – Pichanz

+0

哦,對不起!你調用close兩次,一次在executeUpdate的主體中,但是再次在finally中調用。我沒有看到第二個電話。請嘗試unreturnedConnectionTimeout和debugUnreturnedConnectionStackTraces以查看是否可以找到任何連接泄漏。 –

+0

ooops,沒有意識到有2關閉()的方法,感謝您的幫助..我會嘗試現在測試它。讓我們看看現在是否有任何連接泄漏。感謝您的幫助 – Pichanz