2017-01-03 5 views
-1

Я знаю, что это, вероятно, аналогичный вопрос от остальных (изначально, прежде чем я попробовал что-то новое, это было немного уникально, но оно никогда не решало главной проблемы), но мне, вероятно, нужно обсудить это с кем-то, кто может помочь, потому что я никогда не мог получить то, что вызывает это, несмотря на то, что я уже читал разные сообщения с этого сайта. Итог - мне нужно продолжать делать много последовательных запросов, но в итоге я создал слишком много соединений.Ошибка 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, потому что часто он находится внутри цикла и все равно заменяется новыми данными.

Опять же, моя проблема в том, что я не могу продолжать получать данные из-за слишком большого количества соединений. Я действительно закрываю вещи, или я что-то упускаю? Любые предложения по устранению этого? Если мой вопрос слишком запутан, я добавлю дополнительную информацию, если потребуется. Спасибо. Если кто-то хочет сильно помочь мне, я пошлю по электронной почте. Спасибо! И с Новым годом, кстати.

+0

Вы слишком часто закрываете соединения! – e4c5

+0

Это не очень хороший дизайн, что произойдет, если какой-то набор результатов большой, и вам нужен еще один «callSQLMethod»? –

+0

Ну, наверное, моя причина - поймать исключения, которые говорят, что я ничего не могу сделать с результатами, поскольку соединение было закрыто. Следовательно, почему я называю этот метод переподключения. – yamahadinosaur

ответ

1

Кажется, вы создаете много соединений и рекурсивно открываете ResultSet. Не создавайте новые подключения все время, все, что вам нужно, это одно соединение и не пересоединяйте все время. Вам вообще не нужен метод переподключения (если вы не закрываете соединение автоматически, и в этом случае вы можете проверить, закрыт ли он перед выполнением запроса). И вам нужно закрыть ResultSet, как только вы закончите получение значений.

Все, что вам нужно, это данные, а не набор результатов. Поэтому возьмите данные и отпустите ресурс, то есть ResultSet. Так что это -

в вашем getMemberViaMemberId не возвращается ResultSet, в том, что сам методе, перебирать результирующую и создать объект для строки и сохранить его в коллекцию и вернуть эту коллекцию после закрытия ResultSet. И не назовите метод reconnect.

Закройте одно соединение, которое у вас есть при выходе из программы.

+0

Ваш ответ выглядит хорошо, так как он облегчает мое замешательство в том, как я должен его перекодировать, и я вернусь к вам, как только я это осуществил. Но вы действительно поняли, что соединение закрывается автоматически, и я получаю сообщение об ошибке, которое говорит, что не может вызвать причину после закрытия соединения. Вот почему я создал повторное подключение из-за этой ошибки и, кроме того, добавил con.close(), прежде чем снова создать соединение, чтобы убедиться, что оно обязательно закрыто. – yamahadinosaur

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