2014-11-25 3 views
0

У меня есть удаленная база данных MySQL. В Java, у меня есть пул соединений:Пул соединений MySQL превышает максимальное количество подключений в Java

pool = new MysqlConnectionPoolDataSource(); 
pool.setURL("jdbc:mysql://1.2.3.4:3306/TEST?max-connections=100"); 
pool.setUser("USER"); 
pool.setPassword("PASSWORD"); 

Максимальное количество подключений 100. Теперь давайте сделать 100 резьб:

for (int i = 0; i < 100; ++i) { 
    Thread t = new Thread(new Client(i, pool)); 
    t.start(); 
} 

И это код, выполняемый в каждом потоке:

class Client implements Runnable { 
    int id; 
    MysqlConnectionPoolDataSource pool; 
    public Client(int id, MysqlConnectionPoolDataSource pool) { 
     this.id = id; 
     this.pool = pool; 
    } 
    public void run() { 
     while (true) { 
      try { 
       Connection conn = pool.getConnection(); 
       ResultSet set = conn.createStatement().executeQuery("SELECT * FROM SOMETHING"); 
       if (set.next()) { 
        System.out.println(id + " finished."); 
       } 
       set.close(); 
       conn.close(); 
       return; 
      }catch (Exception e) { 
       System.out.println("ERROR " + id + " -> " + e.getMessage()); 
      } 
     } 
    } 
} 

Итак, у меня есть бассейн с 100 максимальными соединениями, а затем 100 потоков, пытающихся использовать по одному соединению.

И все же, есть несколько ошибок вида:

ERROR 30 -> Пользователь уже имеет более активных соединений «max_user_connections»

Но почему, если максимальное количество подключений составляет 100?

В самом деле, даже если вы измените его на

pool.setURL("jdbc:mysql://1.2.3.4:3306/TEST?max-connections=300"); 

Проблема сохраняется.

Конечно, в конце концов, соединение выполнено, и я могу выполнить запрос. Но я не понимаю, почему я могу превышать количество соединений.

ответ

2

max_user_connections является сервер установка в my.ini: см here. Он не имеет ничего общего с пулом соединений, Java и т. Д.

1

Если вы не поставщик сервера приложений, вы не должны использовать MysqlConnectionPoolDataSource.

ConnectionPoolDataSources является не пулы подключений. Это поставщики соединений с кодом объединения соединений. Помимо создания этих физических соединений, ConnectionPoolDataSource не должен ничего делать.

В любом случае, физическое соединение не уходит, пока вы не вызовете PooledConnection.close(), вызывая conn.close() только закрывает соединение с логическим, который требует, чтобы любые слушатели на ConnectionPoolDataSource можно назвать так, что он может вернуть, но не близко физическое соединение, так что он может быть передан снова

так что, если вы работаете на сервере приложений, использовать пулы предоставленных DataSources сервера приложений

Если вам нужно автономное соединение пул использует сторонние пулы соединений, такие как BoneCP, c3p0 или Apache DBCP

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