2013-04-11 91 views
0

我一直在使用Tomcat和mySQL很長一段時間,但最近一直在設法最大化我的連接。我不知道爲什麼當我的代碼打開並在完成時關閉連接。比如這裏是我的連接和關閉的方法:Tomcat和mySQL配置

public void closeConnection(){ 
    try { 
     con.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

public void connect(){ 
    try { 
     initCtx = new InitialContext(); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
    try { 
     envCtx = (Context) initCtx.lookup("java:comp/env"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
    try { 
     ds = (DataSource) envCtx.lookup("jdbc/TestDB"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    }   
} 

這是執行通用聲明的基本方法:

public void excuteStatement(String query){ 

     connect(); 

    try { 
     con = ds.getConnection(); 
     con.createStatement().executeUpdate(query); 
     } catch (Exception ex){    
    } finally { 
     if (con != null) 
      closeConnection(); 
    }  
} 

是否有任何理由這種代碼應該會導致連接是保持開放?我獲得了我需要的所有數據,99%的時間內一切正常。

這是我在Tomcat的context.xml配置:

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      username="myUserName" password="myPass" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://xxx.xxx.xxx.xxx:0000/myUserName"/> 

現在,在這個非常時刻,我被鎖在我有最大連接數。我應該減少等待時間來避免這種情況嗎?

我應該說我的代碼的一件事,它經常會在大循環中觸發許多多個語句。我想也許這個快速開放和關閉可能是問題。由於我的Tomcat servlet一直運行,只要它打開一個連接一次,並打開它的檢查,以確保它仍然活躍,而不是總是打開連接並關閉它?

感謝您對此的任何建議。

+0

WRT您的問題 - 當您的連接超出最大值時,您的應用程序將掛起?如果是這樣,您可能在代碼和表鎖的組合中遇到問題 – 2013-04-11 19:51:05

+0

您看到的實際問題是什麼?看起來您正在使用連接池,因此您的連接不會真正關閉,只需放回池中即可。這可以解釋爲什麼你的連接保持開放! – 2013-04-11 20:04:37

+0

我應該如何使用連接池?問題是數據庫連接最多。該應用程序不掛它只是無法獲得任何數據。 – 2013-04-12 05:15:17

回答

0

是減少你的等待時間,這太高了。在MySQL中,您可以增加最大連接的數值,將其增加到您的盒子可以處理的合理大小。

+0

什麼是明智的等待時間? – 2013-04-12 05:17:07

+0

@CloudyDna - 你能解釋爲什麼你認爲減少等待時間會有幫助嗎? – 2013-04-12 08:00:22