JDBC 错误 "Too many connections"
JDBC error "Too many connections"
我创建了一个 java swing 应用程序,其中基本上用户登录进入主 window 和 select 一个引导用户进入新 window 在这里你可以输入数据到数据库。
在更新数据库的第 3 个 window 中,我使用了一个 jcombobox,其中的项目是从数据库加载的。
当我调试它时,它 运行 是正确的。但是当我尝试 运行 应用程序从上到下时,显示更新 window 但未加载 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();
}
以上是我使用连接的主要 windows' 代码。这些工作正常。
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 是我在连接 class 中为方便起见创建的两个方法。
:)
提前致谢:)
我可以看到您正在以下行中创建连接:
ResultSet rs3 = new DBconnect().*;
那么你只是关闭 ResultSet - rs3.close();
谁负责关闭您的数据库连接以及如何关闭?
现在如何解决:
您的代码中不需要内部 try 块 - 所以将其删除。
正在连接:
DBconnect dbconnect = new DBconnect();
ResultSet rs3 = dbconnect..getdata("...");;
退出 try 块之前 - 关闭 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();
}
}
在 classes 中使用 DBconnect class 除了关闭连接外不需要其他更改:
dbconnect.close();
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();
}
}
这是我的 DBconnect class
我创建了一个 java swing 应用程序,其中基本上用户登录进入主 window 和 select 一个引导用户进入新 window 在这里你可以输入数据到数据库。
在更新数据库的第 3 个 window 中,我使用了一个 jcombobox,其中的项目是从数据库加载的。
当我调试它时,它 运行 是正确的。但是当我尝试 运行 应用程序从上到下时,显示更新 window 但未加载 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();
}
以上是我使用连接的主要 windows' 代码。这些工作正常。
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 是我在连接 class 中为方便起见创建的两个方法。
:) 提前致谢:)
我可以看到您正在以下行中创建连接:
ResultSet rs3 = new DBconnect().*;
那么你只是关闭 ResultSet - rs3.close();
谁负责关闭您的数据库连接以及如何关闭?
现在如何解决:
您的代码中不需要内部 try 块 - 所以将其删除。
正在连接:
DBconnect dbconnect = new DBconnect();
ResultSet rs3 = dbconnect..getdata("...");;
退出 try 块之前 - 关闭 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();
}
}
在 classes 中使用 DBconnect class 除了关闭连接外不需要其他更改:
dbconnect.close();
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();
}
}
这是我的 DBconnect class