Написав тести на сервак (Java, Testng), в сумі вишло близько 200. Під час проходження їх, деякі тести подають з помилкою om.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections. Знаю, що в кожного сервака є виставлене своє максимальне число відкритий конекшенів - для зміни його треба робити задачку на адмінив і тд. Мені здається, що є інший спосіб контроювати якось кількість конекшенів до БД.
public static int getUserId(String deviceId, int appId) throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
int userId = 0;
Statement st = connectToDB().createStatement();
ResultSet vv = st.executeQuery("SELECT user_id FROM .........");
while (vv.next()) {
userId = vv.getInt("user_id");
}
st.close();
connectToDB().close();
return userId;
}
Я пробував робити затримку через Thread.sleep(), але результат не змінився. Завжди вилітає помилка Too many connections на одинх і тих самих тестах.
Дану проблему гуглив, але чіткої відповіді не найшов (або не зрозумів). Підскажіть, хто стикався з такою проблемо і як її вирішив?
Маю клас DataBaseQueries, в якому присутній метод connectToDB() і методи типу getUserId(String deviceId, int appId).
В методі getUserId(String deviceId, int appId) параметри deviceId і appId використовуються в SELECT, я їх видалив, так як це не має значення.
public class DataBaseQueries {
static private String DB_URL = "";
static private String DB_USER = "";
static private String DB_PASS = "";
public static Connection connectToDB() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
Class.forName("com.mysql.jdbc.Driver").newInstance();
return DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
}
public static int getUserId(String deviceId, int appId) {
}
public static String getUserData(int userId){
}
}
Тобто у вас під час запуску необхідно тримати таку велику кількість відкритих коннекшенів? Можливо варто спробувати їх закривати післ отриання відповіді, або використовувати один відкритий звязок з базою данних і його перевиконистовувати?
Так я ж закриваю… Створюю обєкт Statement st, а в кінці метод закриваю його st.close(); + connectToDB().close();
Спробував поміняти місцями закриття connectToDB() і st - але нічого не змінилось.
Во-первых, подключение к БД - дорогая операция. Т.е. гораздо эффективней в вашем случае держать один конекшен от начала и до конца тестового набора.
Во-вторых, как уже отметили выше, - после закрытия стейтмента вы открываете новый конекшен и сразу же закрываете. Но старый, при этом, по-прежнему остается висеть. При вашей текущей реализации вы не сможете сделать иначе до тех пор, пока не вынесите конекшен на уровень инстанс филда.