2016-08-31 3 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()); 
     } 
     } 
    } 

и класс GetConnection(), который запрашивает соединение из пула соединений

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

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

     return con; 
    } 

EDIT: вот настройки пула подключений:

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.

Смежные вопросы