У меня есть удаленная база данных 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");
Проблема сохраняется.
Конечно, в конце концов, соединение выполнено, и я могу выполнить запрос. Но я не понимаю, почему я могу превышать количество соединений.