2016-08-31 179 views
0

當我嘗試運行一個程序時,出現「太多連接」錯誤,該程序要求使用tomcat庫實現的連接池進行連接,在大約50次連接後失敗,這裏是錯誤:Java - MySQL不關閉連接

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 

這裏的主類,它有一個循環,在這裏執行連接

public static void main(String[] args) throws Exception{ 
     SimplePoolExample ex = new SimplePoolExample(); 

     int cont = 100; 

     while (cont > 0) 
     { 
     ex.test(); 
     System.out.println(cont); 
     cont--; 
     } 

    } 

是執行一個簡單的查詢測試()函數

public void test() throws Exception 
    { 

     Connection con = getConnection(); 
      try (Statement st = con.createStatement()) { 
       ResultSet rs = st.executeQuery("select * from actor"); 

      while (rs.next()) { 
        System.out.println(rs.getString("actor_id") +" "+ rs.getString("first_name")+" "+ rs.getString("last_name")); 
       } 

      rs.close(); 
      st.close(); 

     } finally { 
     if (con!=null) try { 
      con.close(); 
     } 

     catch (SQLException ignore) { 

      System.out.println("***SQL EXC" + ignore.getMessage()); 
     } 
     } 
    } 

,並詢問從一個連接池

public Connection getConnection() throws SQLException 
    { 
     DataSource datasource = new DataSource(); 
     datasource.setPoolProperties(p); 

     Connection con = null; 
     con = datasource.getConnection(); 

     return con; 
    } 

編輯的連接的getConnection()類:這裏是連接池設置:

public void setPoolProperties() 
    {  

     p.setUrl("jdbc:mysql://localhost:3306/sakila"); 
     p.setDriverClassName("com.mysql.jdbc.Driver"); 
     p.setUsername("user"); 
     p.setPassword("pwd"); 
     p.setJmxEnabled(true); // utilities to manage JVM 
     p.setTestWhileIdle(false); // test idle connections 
     p.setTestOnBorrow(true); // 
     p.setValidationQuery("SELECT 1"); // any test requires it 
     p.setTestOnReturn(false); 
     p.setValidationInterval(30000); // cada cuanto hace test 
     p.setTimeBetweenEvictionRunsMillis(30000); // how often check idle and abandoned conn 
     p.setMaxActive(50); 
     p.setInitialSize(10); 
     p.setMaxWait(50); 
     p.setRemoveAbandonedTimeout(60); // OJO: max query last 
     p.setMinEvictableIdleTimeMillis(30000); // time to consider a conn idle 
     p.setMaxIdle(10); 
     p.setMinIdle(10); 
     p.setLogAbandoned(true); // log stack traces .. overhead 
     p.setRemoveAbandoned(true); //abandoned timeout ... 
     p.setJdbcInterceptors(
     "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ 
     "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); 
    } 
+2

連接池支持多少個連接?您可能希望將其限制爲小於MySql可支持的連接數的最大連接數。 – alfasin

+0

我更新了帖子的池設置,我認爲它被限制爲MySql支持的最大連接數(默認爲151) – Jose

回答

4

您正在創建一個完全新的連接每次調用getConnection()

您應該使用DataSource的單個共享實例。