【问题标题】:java "database is locked" SQL exceptionjava“数据库被锁定”SQL异常
【发布时间】:2017-07-04 03:56:31
【问题描述】:

我正在创建一个真正的 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(query);触发错误并使程序崩溃。我认为这里的问题是数据库已经打开了一个连接并且无法处理 conn3,但是我需要在 while 循环中使用这些其他连接,同时我需要能够在 if while 中下达命令周期。我怎样才能使新订单不干扰while循环但同时执行查询?

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

【问题讨论】:

  • 请显示完整的堆栈跟踪
  • 你为什么放mysqlsql-server标签?您使用的是什么确切的数据库?
  • 这是因为你永远不会关闭你的连接。为此使用更好的数据结构。将您的结果集保存在地图或数组中。或者为此使用更好的查询。

标签: java mysql database


【解决方案1】:

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

另外, conn1 被实例化为 DBConnection.dbconnection(); conn2 被实例化为 DBConnection.connection(); conn3 被实例化为 DBConnection.dbconnection();

看到区别了吗?

【讨论】:

  • 不同的调用是由于我将代码从意大利语类名称翻译成英语,以使其对站点更具可读性。有东西溜走了,它在这里结束了调用不同的东西,在代码上它是正确的。遗憾的是,关闭连接使得无法正确执行 while 循环,因此我不得不将其保持打开状态...我找到了一种解决方法,将信息保存在 if() 中的某些数组中,然后在结束时调用新连接文件,在所有连接都关闭之后。非常感谢您的帮助!
【解决方案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 或 Map 之类的内容中。这样您就可以关闭连接并仍然从另一个对象访问数据。

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多