在请求的时间内无法获得锁定

时间:2013-03-23 02:19:01

标签: java database netbeans derby

标题是我得到的错误,当我点击加载我的程序冻结。我假设它是因为我在一个声明中做了一个声明,但从我看到它是我的问题的唯一解决方案。通过加载我想重新填充患者列表,但为此我还需要做他们的条件。代码有效,底层方法是我正在尝试解决的问题。我认为问题在于我有2个陈述,但我不确定。 负载:

public void DatabaseLoad()
{
    try
    {
        String Name = "Wayne";
        String Pass= "Wayne";
        String Host = "jdbc:derby://localhost:1527/Patients";
        Connection con = DriverManager.getConnection( Host,Name, Pass);
        PatientList.clear();


        Statement stmt8 = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,        
             ResultSet.CONCUR_UPDATABLE);
        String SQL8 = "SELECT * FROM PATIENTS";
        ResultSet rs8 = stmt8.executeQuery( SQL8 );
        ArrayList<PatientCondition> PatientConditions1 = new ArrayList();

        while(rs8.next())
        {
            PatientConditions1 = LoadPatientConditions();
        }

        Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,    
            ResultSet.CONCUR_UPDATABLE);
        String SQL = "SELECT * FROM PATIENTS";
        ResultSet rs = stmt.executeQuery( SQL );

        while(rs.next())
        {
            int id = (rs.getInt("ID"));
            String name = (rs.getString("NAME"));
            int age = (rs.getInt("AGE"));
            String address = (rs.getString("ADDRESS"));
            String sex = (rs.getString("SEX"));
            String phone = (rs.getString("PHONE"));

            Patient p = new Patient(id, name, age, address, sex, phone,
                PatientConditions1);
            PatientList.add(p);
       }

        UpdateTable();
        UpdateAllViews();

        DefaultListModel PatientListModel = new DefaultListModel();

        for (Patient s : PatientList) {
            PatientListModel.addElement(s.getAccountNumber() + "-" + s.getName());
        }

        PatientJList.setModel(PatientListModel);

       }

    catch(SQLException err)
    {
        System.out.println(err.getMessage());
    }


}

这是返回患者病症的arraylist的方法

public ArrayList LoadPatientConditions()     
{ 
    ArrayList<PatientCondition> PatientConditionsTemp = new ArrayList();
    try
    {
        String Name = "Wayne";
        String Pass= "Wayne";
        String Host = "jdbc:derby://localhost:1527/Patients";
        Connection con = DriverManager.getConnection( Host,Name, Pass);
        Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,   
            ResultSet.CONCUR_UPDATABLE);
        String SQL = "SELECT * FROM PATIENTCONDITIONS";
        ResultSet rs5 = stmt.executeQuery( SQL );

        int e = 0;
        while(rs5.next())
        {
            e++;
            String ConName = (rs5.getString("CONDITION"));
            PatientCondition k = new PatientCondition(e,ConName);
            PatientConditionsTemp.add(k);
        }   
     }
     catch(SQLException err)
     {
         System.out.println(err.getMessage());
     }

     return PatientConditionsTemp;
 }

4 个答案:

答案 0 :(得分:3)

有类似的问题。 我正在连接到本地服务器上托管的derby数据库。 我创建了2个同时连接:

  • 松鼠
  • 使用 ij 工具

当连接对表进行修改时,它首先获取特定表的锁。 只有在提交事务后,才会通过连接释放此锁定。 因此,如果第二个连接尝试读/写同一个表,则msg会提示说:
ERROR 40XL1:在请求的时间内无法获得锁定

要解决此问题,修改表的连接必须提交其事务。

希望这有帮助!

答案 1 :(得分:2)

这是一个很好的起点:http://wiki.apache.org/db-derby/LockDebugging

答案 2 :(得分:2)

您还需要关闭语句和结果集,以便在重新启动程序时它们不会打开。在try和catch语句的代码行末尾添加stmt.close();rs.close();

答案 3 :(得分:0)

为什么不能使用相同的连接对象来执行这两个查询? 就像将连接对象作为参数传递给LoadPatientConditions()并在那里使用它一样。