2015-05-10 3 views
0

Я создал приложение java swing, в котором в основном пользовательские журналы попадают в главное окно и выбирают элемент jmenu, который приводит пользователя в новое окно, где вы можете вводить данные в базу данных.Ошибка JDBC «Слишком много соединений»

В этом третьем окне, где обновлена ​​база данных, я использовал jcombobox, где элементы из него загружаются из базы данных.

, когда я отлаживаю его, он работает правильно. Но когда я пытаюсь запустить приложение сверху вниз, отображается окно обновления, но элементы jcombobox не загружаются. он дает ошибку, говорящую слишком много соединений.

Насколько я знаю, я закрыл все соединения правильно.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
String un=jTextField1.getText(); 
String pwd=jPasswordField1.getText(); 
    if(un.isEmpty()){ 
     JOptionPane.showMessageDialog(this,"User Name is empty"); 
    } 
    else if(pwd.isEmpty()){ 
     JOptionPane.showMessageDialog(this,"Password is empty"); 
    } 
    else{ 
    try { 
     DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss"); 
     Calendar cal = Calendar.getInstance(); 

     ResultSet rs=new DBconnect().getdata("SELECT * FROM user"); 
     rs.next(); 
     if ((rs.getString("Name").equals(un))&&(rs.getString("pw").equals(pwd))){ 
      new DBconnect().putdata("INSERT INTO login (Date,User) VALUES('"+dateFormat.format(cal.getTime())+"','"+un+"')"); 
      new MainWindow().setVisible(true); 

      this.dispose(); 
     } 
     else{ 
      JOptionPane.showMessageDialog(this, "Invalid user name or password"); 
      jTextField1.setText(""); 
      jPasswordField1.setText(""); 
     } 
     rs.close(); 
    } catch (Exception ex) { 
     Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    } 
}           

выше - мой код форм для входа.

public MainWindow() { 
    setExtendedState(JFrame.MAXIMIZED_BOTH); 
    new Thread(){ 
     public void run(){ 
      while(true){ 
     DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     Calendar cal = Calendar.getInstance(); 

     DateFormat dateFormat2 = new SimpleDateFormat("yyyy/MM/dd"); 
     Calendar cal2 = Calendar.getInstance(); 

     jLabel1.setText(dateFormat.format(cal.getTime())); 

       try { 
        ResultSet rs=new DBconnect().getdata("SELECT COUNT(Pno) FROM medicalhistory WHERE Date ='"+dateFormat2.format(cal2.getTime())+"'"); 
        rs.next(); 
        jLabel4.setText(rs.getString("COUNT(Pno)").toString()); 


        ResultSet rs2=new DBconnect().getdata("SELECT SUM(Amount) FROM income WHERE Date ='"+dateFormat2.format(cal2.getTime())+"'"); 
        rs2.next(); 
        jLabel5.setText(rs2.getString("SUM(Amount)").toString()); 
        rs2.close(); 
        rs.close(); 

       } catch (Exception ex) { 
        Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
    }.start(); 


    initComponents(); 
} 

приведенный выше код основного окна, в котором использовались соединения IW. они работают правильно.

public addnewpatient() { 
      setExtendedState(JFrame.MAXIMIZED_BOTH); 


    initComponents(); 
     try { 
       try (ResultSet rs3 = new DBconnect().getdata("SELECT Name FROM drugstock WHERE stockAmount >0")) { 
        Vector v= new Vector(); 
        while(rs3.next()){ 
         String ids = rs3.getString("Name"); 
         v.add(ids); 
         jComboBox1.addItem(ids); 
        } 
        jComboBox1.addItem("Null"); 
        rs3.close(); 
       } 

    } 


     catch (Exception ex) { 
     Logger.getLogger(addnewpatient.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

код выше придает слишком много ошибок при подключении.

putdata и getdata - это два метода ive, созданный в классе соединений для удобства.

:) Thanx заранее :)

+0

Прилагайте исключения, которые вы видите в этом посте. – Rajesh

ответ

2

Я вижу, что вы создаете соединения в строке ниже:

ResultSet rs3 = new DBconnect().*; 

Тогда вы просто закрыть ResultSet - rs3.close();

Кто позаботится о закрытии соединений с базой данных и как?

Как исправить прямо сейчас:

Там нет необходимости внутреннего блока попробовать в вас код - так удалить его.

Получение соединения:

DBconnect dbconnect = new DBconnect(); 
ResultSet rs3 = dbconnect..getdata("...");; 

Перед выходом попробовать блок - близко ResultSet, подключение.

rs3.close(); 
dbconnect.close(); 

Заменить DBConnect.java, как показано ниже:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Date; 

public class DBconnect { 
    static String url = "jdbc:mysql://localhost:3306/ppmgt"; 
    Connection conn; 
    Statement st; 

    public DBconnect() { 

     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      this.conn = DriverManager.getConnection(url, "root", ""); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void putdata(String sql) throws Exception { 
     st = this.conn.createStatement(); 
     st.executeUpdate(sql); 
    } 

    public ResultSet getdata(String sql) throws Exception { 
     Statement st = this.conn.createStatement(); 
     return st.executeQuery(sql); 
    } 

    public void close() { 
     try { 
      this.conn.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static long compareTo(Date date1, Date date2) { 
     return date1.getTime() - date2.getTime(); 
    } 
} 

Там нет других изменений, необходимых в классах с использованием БДСВЯЗЬ класса, кроме закрытия соединения:

dbconnect.close(); 
+0

если я использую наконец { try { rs.close();} catch (исключение e) {}; } он дает ошибку в главном блоке try –

+0

, пожалуйста, сообщите мне, как закрыть соединение тогда и там. Я не могу закрыть соединение в методах putdata и getdata в классе соединений. –

+0

Еще лучше: используйте try-with-resources. –

0
public class DBconnect { 
static String url = "jdbc:mysql://localhost:3306/ppmgt"; 



public static Connection con() throws Exception { 
    Class.forName("com.mysql.jdbc.Driver"); 
    Connection c = DriverManager.getConnection(url, "root", ""); 
    return c; 
} 

public void putdata(String sql) throws Exception { 
    Connection c = DBconnect.con(); 
    Statement st = c.createStatement(); 
    st.executeUpdate(sql); 

} 

public ResultSet getdata(String sql) throws Exception { 
    Connection c = DBconnect.con(); 
    Statement st = c.createStatement(); 
    ResultSet r = st.executeQuery(sql); 

    return r; 
} 

    public static long compareTo(Date date1,Date date2) { 
    return date1.getTime() - date2.getTime(); 
} 

}

это мой DBco nnect class

+0

Я обновил ответ с измененным DBConnect.java – Rajesh

+0

да спасибо Раджеш. Это мне очень помогло. :) –

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