Java 爪哇语;“数据库已锁定”;SQL异常

Java 爪哇语;“数据库已锁定”;SQL异常,java,mysql,database,Java,Mysql,Database,我正在创建一个真正的DB密集型java程序,但在连接上遇到了一个错误。代码是: try{ Statement st; ResultSet rs; conn = DBConnection.dbconnection(); st = conn.createStatement(); String s = "select * from tab2DB order by Scadenza"; rs = st.ex

我正在创建一个真正的DB密集型java程序,但在连接上遇到了一个错误。代码是:

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();
    }
错误在if(localDate.after(date)){…}上 其中stmt.executeUpdate(查询);触发错误并使程序崩溃。我认为这里的问题是DB已经打开了一个连接,无法处理conn3,但是我需要在while循环中使用其他连接,同时我需要能够在if循环中发出命令。如何使新的顺序不干扰while循环,而是同时执行查询

(查询尝试执行的操作在上面的代码中可能不起作用,这是一个更大类的代码片段)


谢谢你的帮助

执行查询后,应立即调用
Connection
对象上的
close()

而且,
conn1
被实例化为
DBConnection.DBConnection()
conn2
被实例化为
DBConnection.connection()
conn3
被实例化为
DBConnection.DBConnection()


看到区别了吗?

您可以利用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
        }
}

此外,正如其他用户所提到的,我建议遍历结果并添加到列表、集合或映射之类的内容中。通过这种方式,您可以关闭连接并仍然从另一个对象访问数据。

请显示完整堆栈跟踪为什么要放置
mysql
sql server
标记?你正在使用什么样的数据库?这是因为你从未关闭过连接。为此,请使用更好的数据结构。将结果集保存在地图或数组中。或者对此使用更好的查询。不同的调用是由于我将代码从意大利语类名翻译成英语,使其更易于网站阅读。有些东西漏掉了,它在这里调用了不同的东西,在代码上是正确的。可悲的是,关闭连接无法正确执行while循环,因此我被迫将其打开。。。我在if()中找到了一种解决方法,可以在一些数组中保存信息,然后在文档末尾调用一个新连接,在所有连接都关闭之后。非常感谢你的帮助!