2017-02-15 80 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()中的某些数组内部保存信息,然后在文件,所有连接都关闭后。尽管非常感谢您的帮助! –