Я знаю, что это, вероятно, аналогичный вопрос от остальных (изначально, прежде чем я попробовал что-то новое, это было немного уникально, но оно никогда не решало главной проблемы), но мне, вероятно, нужно обсудить это с кем-то, кто может помочь, потому что я никогда не мог получить то, что вызывает это, несмотря на то, что я уже читал разные сообщения с этого сайта. Итог - мне нужно продолжать делать много последовательных запросов, но в итоге я создал слишком много соединений.Ошибка JDBC слишком много соединений
Что моя программа делает, так это то, что она отображает данные о каждом члене и что это своего рода дерево или сеть, где, чтобы получить данные, необходимые для каждого члена, вам нужно разведать всех других членов, указывающих на этот текущий член (или данные ребенка) и данные члена, который указывает члену, который указывает на текущего участника (или данные внука) и так далее. Следовательно, почему мне нужно продолжать делать запросы, я должен получить данные от каждого ребенка. На каждом узле я думаю, что у детей младше 5 лет и на 34-м члене я получил сообщение об ошибке «Too Many Connections».
Я прочитал, как открывать и закрывать соединения и все, но я все еще делаю это неправильно? Я попытался изменить максимальные соединения, но для меня это не очень долгое решение. Вот как я это делаю:
public class SQLConnect {
private Connection con;
private Statement st;
private ResultSet rs;
public SQLConnect() {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname?zeroDateTimeBehavior=convertToNull", "root", "");
st = con.createStatement();
} catch (ClassNotFoundException | SQLException ex) {
System.out.println("Error in constructor: " + ex);
}
}
//this method gets called before I make another query
public void reconnect() {
try {
st.close();
con.close();
if (con.isClosed()) {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "root", "");
st = con.createStatement();
}
} catch (SQLException ex) {
Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex);
}
}
//sample method on how I do queries
public ResultSet getMemberViaMemberId(String mID) {
try {
String query = "CALL getMemberViaMemberId(" + mID + ");"; //procedure call
rs = st.executeQuery(query);
} catch (Exception ex) {
System.out.println("Error: " + ex);
}
return rs;
}
}//end of class
Так я называю это в моем JForm есть это ..
SQLConnect connect;
public Class(){
connect = new SQLConnect();
}
public void methodThatGetsCalledALot(String current_id){
connect.reconnect(); //refer to SQLConnectClass displayed above
ResultSet member = connect.getMemberViaMemberId(current_id);
try{
if (member.next()) {
lastName = member.getString("last_name");
firstName = member.getString("first_name");
}
//display data...
} catch (SQLException ex){
}
}
Код:
connect.reconnect();
ResultSet rs = connect.callSQLMethod();
является наиболее важным бит и называется по каждому классу и по каждому методу, который должен извлекать данные. Я должен признать, что я никогда не буду закрывать ResultSet, потому что часто он находится внутри цикла и все равно заменяется новыми данными.
Опять же, моя проблема в том, что я не могу продолжать получать данные из-за слишком большого количества соединений. Я действительно закрываю вещи, или я что-то упускаю? Любые предложения по устранению этого? Если мой вопрос слишком запутан, я добавлю дополнительную информацию, если потребуется. Спасибо. Если кто-то хочет сильно помочь мне, я пошлю по электронной почте. Спасибо! И с Новым годом, кстати.
Вы слишком часто закрываете соединения! – e4c5
Это не очень хороший дизайн, что произойдет, если какой-то набор результатов большой, и вам нужен еще один «callSQLMethod»? –
Ну, наверное, моя причина - поймать исключения, которые говорят, что я ничего не могу сделать с результатами, поскольку соединение было закрыто. Следовательно, почему я называю этот метод переподключения. – yamahadinosaur