2017-06-23 361 views
1

錯誤: - 重度:空 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:數據源被拒絕建立連接的,從服務器消息:「太多的連接」 代碼如下所示在Java JDBC太多連接

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"); 
     } 
+3

請發表您的代碼不使用圖片 –

+2

您需要在使用後關閉語句和連接,否則它們將保持打開狀態,並且在某些時候您會看到此錯誤。請參閱:[使用JDBC處理SQL語句](https://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html) – Jesper

回答

0

您似乎在創建連接並且從不關閉它們,儘管它很難從您提出的圖像中分辨出來。

+0

我在哪裏關閉連接? –

+0

你在哪裏做INSERT語句。你應該看看使用'try/catch/finally'或'try with resources'。互聯網上有很多例子,我可以想象Jesper在你的問題的評論中添加的鏈接將詳細涵蓋 – DaveH

+0

你現在可以查看我的代碼嗎? –

0

如果您的應用程序需要多個連接,則應該使用連接池,如Apache DB連接池,您可以在其中配置連接數。這裏是DBCP文檔的鏈接https://commons.apache.org/proper/commons-dbcp/

如果您確定您的應用程序只需要一個連接,請將您的連接對象設置爲DBUtil類中的Singleton對象。這一定會解決問題,無需關閉連接。您的整個應用程序將使用單個連接對象連接到數據庫。

+0

我稍微改了一下你的答案,並且首先把連接池方案放在第一位,因爲現在比單連接用例更常見。 –

2

的問題是:

PreparedStatement pst = Dutil.getConnection().prepareStatement(sql); 

您還沒有表現出的Dutil的代碼,但假設它創建在每次調用一個新的連接,這意味着連接是沒有得到關閉,把它留給運氣,驅動程序實現細節,以及垃圾收集器來關閉它。

相反,你應該使用try-with-resources

try (Connection connection = Dutil.getConnection(); 
    PreparedStatement pst = connection.prepareStatement(sql)) { 
    // Use pst 
} 

該塊結束後,雙方pstconnection將被正確關閉,即使發生異常等