2017-02-15 64 views
4

我正在創建一個真正的數據庫密集型java程序,但是我在連接時遇到了一個錯誤。的代碼是:java「數據庫被鎖定」SQL例外

try{ 
     Statement st; 
     ResultSet rs; 
     conn = DBConnection.dbconnection(); 
     st = conn.createStatement(); 
     String s = "select * from tab2DB order by Scadenza"; 
     rs = st.executeQuery(s); 
     while(rs.next()){ 
      ResultSet rs2; 
      PreparedStatement st2; 
      conn2 = DBConnection.connection(); 
      String s2 = "select * from Prodotti where Nome = ?"; 
      st2 = conn2.prepareStatement(s2); 
      st2.setString(1, rs.getString("Prodotto")); 
      rs2 = st2.executeQuery();    
      while(rs2.next()){ 

       Date localDate = new Date(); 

       String scadenza = rs.getString("Scadenza"); 
       DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ITALIAN); 
       Date date = format.parse(scadenza); 



       if(localDate.after(date)){ 
         conn3 = DBConnection.dbconnection();   
         String query ="insert into tabDB values ('"+nomeord+"','"+prodottoord+"','"+quantitàord+"')"; 
         Statement stmt; 
         stmt = conn3.createStatement(); 
         stmt.executeUpdate(query); 
         conn3.close(); 
         continue; 
       } 

       //other building of interface in the while, omitted for clarity purpose 
       conn2.close(); 
       rs2.close(); 
       } 
       conn.close(); 
       rs.close(); 
    } 
    catch (SQLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

錯誤是在如果(localDate.after(日期)){...} 其中stmt.executeUpdate(查詢);觸發錯誤並使程序崩潰。我認爲這裏的問題是,數據庫已經打開連接,無法處理conn3,但我需要while循環的其他連接,並且同時我需要能夠在if內部發出命令週期。我怎樣才能使新訂單不會干擾while循環,但同時執行查詢?

(什麼查詢試圖做可能不會在上面的代碼工作,這是一個大的方法類的一個片段)

感謝您的幫助!

+0

顯示完整的堆棧跟蹤請 – Andremoniy

+0

爲什麼你把'mysql'和'sql-server'標籤?你使用了什麼確切的數據庫? – Andremoniy

+0

這是因爲你永遠不會關閉你的連接。爲此,請使用更好的數據結構。將結果集保存到地圖或數組中。或Usea更好的查詢爲此。 – Gatusko

回答

2

您可以利用try-with-resources來確保所有資源在語句結束時關閉。

例子:

try (Connection con = ConnectionManager.dbconnection(); 
    Statement statement = con.createStatement(); 
    ResultSet resultSet = statement.executeQuery(query)) { 
     while(resultSet.next) { 
      //Add desired values to data structure 
     } 
} 

此外,由於其他用戶已經提到的,我建議通過迭代的結果並添加到像一個List,Set或者地圖。這樣您可以關閉連接並仍然訪問另一個對象的數據。

0

只要您的查詢執行完畢,您應該立即在您的Connection對象上調用close()

此外, conn1被實例化DBConnection.dbconnection(); conn2被實例化DBConnection.connection(); conn3被實例化DBConnection.dbconnection();

看到區別?

+1

不同的調用是由於我將代碼從意大利語類名翻譯成英文,以使其對網站更具可讀性。一些東西溜了出來,它結束了在這裏調用不同的東西,代碼是正確的。令人遺憾的是,關閉連接使得無法正確執行while循環,所以我不得不保持它打開......我發現了一種解決方法,在if()中的某些數組內部保存信息,然後在文件,所有連接都關閉後。儘管非常感謝您的幫助! –