java - JDBC错误 "Too many connections"

标签 java jdbc connection

我创建了一个java swing应用程序,其中基本上用户登录进入主窗口并选择一个jmenu项目,该项目将用户引导到一个新窗口,您可以在其中将数据输入到数据库。

在更新数据库的第三个窗口中,我使用了 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();
}

上面是我使用连接的主窗口代码。这些工作正常。

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 是我在连接类中创建的两个方法。

:) 提前谢谢:)

最佳答案

我可以看到您正在以下行中创建连接:

ResultSet rs3 = new DBconnect().*;

那么您只需关闭 ResultSet - rs3.close();

谁负责关闭数据库连接以及如何关闭?

现在如何修复:

您的代码中不需要内部 try block - 因此请将其删除。

正在建立连接:

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

退出 try block 之前 - 关闭 ResultSet、Connection。

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 类的类中不需要进行其他更改:

dbconnect.close();

关于java - JDBC错误 "Too many connections",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30148588/

相关文章:

jdbc - 从 Java 访问 Hive 数据

java - 有没有办法确定 Connection 是托管的?

java - Eclipse-Tomcat 设置中的错误 - ClassNotFoundException "1catalina.org.apache.juli.FileHandler"

java - Spring继承@Component并带有构造函数参数

java 1.4 -sql server2000 :is it safe to append text to String in java of size in gbs

debugging - STM32CubeProgrammer : Problem occurred while trying to connect 上的 ST-LINK 错误

r - 尝试使用 R 连接到 Azure 表时出现 HTTP/1.1 400 错误

线程

java - 将 java 应用程序与在线托管的 mysql 数据库连接

java - 如何将多个命名参数传递给 Spring JdbcTemplate?