错误: - 严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接太多” 代码如下所示
try {
BufferedReader br=new BufferedReader(new FileReader(filename));
String line;
String tru="TRUNCATE `project`.`uploadtable`;";
try
{
Statement stmt = Dutil.getConnection().createStatement();
stmt.executeUpdate(tru);
}
catch(Exception e){}
try {
while((line=br.readLine())!=null){
String values[]=line.split("\t");
String[] splitStr = values[1].split(" ");
try {String sql="INSERT INTO `project`.`uploadtable`
(`empid`, `date`, `time`, `in_out_index`) VALUES
('"+values[0]+"', '"+splitStr[0]+"', '"+splitStr[1]+"',
'"+values[3]+"');";
PreparedStatement
pst=Dutil.getConnection().prepareStatement(sql);
pst.executeUpdate();
} catch (SQLException ex) {
System.out.println("Error");
Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE,
null, ex);
}
} br.close();
this.dispose();
LogButtonFrame lbf=new LogButtonFrame();
lbf.clockinouttable();
JOptionPane.showMessageDialog(null,"Upload Complete");} catch
(IOException ex) {
Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE,
null, ex);
}
} catch (FileNotFoundException ex) {
Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE,
null, ex);
}
catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Error");
}
答案 0 :(得分:2)
问题是:
PreparedStatement pst = Dutil.getConnection().prepareStatement(sql);
您没有显示Dutil
的代码,但假设它在每次调用时都创建了一个新连接,这意味着连接没有被关闭,让它运气好,驱动程序实现细节和垃圾收集器关闭它。
相反,您应该使用try-with-resources:
try (Connection connection = Dutil.getConnection();
PreparedStatement pst = connection.prepareStatement(sql)) {
// Use pst
}
在此块结束后,pst
和connection
都将正常关闭,即使发生异常等等。
答案 1 :(得分:0)
你似乎在建立联系而从不关闭它们,尽管从你提出的图像中很难说出来。
答案 2 :(得分:0)
如果您的应用程序需要多个连接,则应使用连接池,例如Apache DB连接池,您可以在其中配置连接数。以下是DBCP文档https://commons.apache.org/proper/commons-dbcp/
的链接如果您确定您的应用程序只需要一个连接,请将您的连接对象作为DBUtil类中的Singleton对象。这肯定会解决问题,无需关闭连接。您的整个应用程序将使用单个连接对象连接到DB。