JDBC SQL数据库被锁定了吗?

时间:2013-03-23 23:11:14

标签: java sql database sqlite

我正在编写一个使用本地SQL数据库来存储数据的程序。

我正在使用此处找到的驱动程序:https://bitbucket.org/xerial/sqlite-jdbc

我试图从数据库中读取并将tableName的内容放入JTable中,如下所示:

public Object[][] getTable(String tableName){
    int columns = getColumnNumber(tableName);
    int rows = getRowNumber(tableName);
    String[] columnNames = getColumnNames(tableName);
    Object[][] table = new Object[rows][columns];
    try{
        Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db");
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery("select * from " + tableName);
        for(int r = 0; r < rows; r++){
            rs.next();
            for (int c = 0; c < columns; c++){
                table[r][c] = rs.getString(columnNames[c]);
            }
        }
        return table;           
    }catch(Exception e){
        System.out.println("ERROR CREATING TABLE ARRAY");
        e.printStackTrace();
        return null;
    }
}

然后我尝试回来并在表格中添加一行:

public boolean addRow(String tableName, Object[] values){
    if(!isDataAcceptable(tableName, values))
        return false;
    try{
        String stmt = "insert into " + tableName + " values (";
        for(int c = 0; c < values.length; c++){
            if(values[c] instanceof String)
                stmt += "'" + values[c] + "'";
            else
                stmt += values[c];
            if(c == (values.length - 1))
                    stmt += ");";
            else
                stmt += ", ";
        }
        System.out.println(stmt);
        Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db");
        Statement statement = connection.createStatement();
        statement.executeUpdate(stmt);
        return true;
    }catch(Exception e){
        System.out.println("ERROR INSERTING ROW");
        e.printStackTrace();
        return false;
    }
}

然后我想用新行更新我之前创建的JTable。

当我尝试添加行时,它会导致异常:

java.sql.SQLException: database is locked

指向该行:

statement.executeUpdate(stmt);

...在addRow()方法中。

为什么数据库已锁定,如何解锁以写入数据库?

1 个答案:

答案 0 :(得分:3)

  

为什么数据库已锁定,如何解锁以写入数据库?

数据库很可能在addRow中被锁定,因为先前对getTable的调用未关闭结果集。代码也无法关闭导致资源泄漏的数据库连接对象。

基本修复是在close()rs对象上调用connection,但您需要以正确的方式执行此操作以使代码可靠。

以下是使用“try with resources”语法在Java 7中执行此操作的推荐方法:

try (Connection connection = 
         DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db"),
     Statement stmt = connection.createStatement(),
     ResultSet rs = stmt.executeQuery("select * from " + tableName)) {
  for (int r = 0; r < rows; r++) {
    rs.next();
    for (int c = 0; c < columns; c++) {
      table[r][c] = rs.getString(columnNames[c]);
    }
  }
  return table;           
} catch (Exception e) {
    System.out.println("ERROR CREATING TABLE ARRAY");
    e.printStackTrace();
    return null;
}

您也可以通过在close块中显式调用finally来执行此操作,但它更详细,如果您需要关闭相关资源,则代码可能难以正确执行......就像这里一样。