当前位置: 首页 > 面试题库 >

JDBC SQL数据库是否被锁定?

于鸿博
2023-03-14
问题内容

我正在编写一个使用本地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()方法中。

为什么数据库被锁定?如何解锁数据库才能写入数据库?


问题答案:

为什么数据库被锁定?如何解锁数据库才能写入数据库?

该数据库很可能已锁定,addRow因为上一次调用getTable并未关闭结果集。该代码还无法关闭数据库连接对象,这将导致资源泄漏。

基本的解决方法是调用close()rsconnection对象,但你需要做的是正确的方法,使你的代码可靠。

这是在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块中显式调用来执行此操作,但这更加冗长,并且如果您有需要关闭的相关资源,则代码可能很难正确使用…像这里一样。



 类似资料:
  • 问题内容: 我在golang中使用sqlite3数据库,但出现错误:“数据库已锁定”。 我知道使用同一数据库文件不能有多个线程。 尽管我的程序中只有一个连接并关闭了所有查询结果,但是它始终会创建2或3个数据库文件的句柄。 我通过使用opendfileview程序对它进行了云检查。 任何人都可以帮助我解决这个问题。提前致谢。 以下代码创建两个数据库文件句柄。 问题答案: 尝试延迟:

  • Im得到一个数据库被锁定(代码5)在我的ListActive中,代码在其他版本的模拟器中工作,但在4.1版本的模拟器中失败 E/SQLiteLog(2132):(5)数据库被锁定E/SQLiteDatabase(2132):无法打开数据库“/data/data/id.online。mydroid/databases/geo。db’。E/SQLiteDatabase(2132):android。数据

  • 我能找到的关于和是由显示的: 最大的问题是:在复制/转储之前,这两个命令是否都会锁定数据库?备份是否一致? 这个答案有一些关于,但是有权威的留档吗?(那么呢?)我能在SQLite的留档中找到的唯一东西是“在线备份应用编程接口”,但我对应用编程接口不感兴趣,我只想备份数据库。

  • 问题内容: 我在我的应用程序中做了一些重复的操作(测试),突然我收到一个奇怪的错误: 我已经重新启动服务器,但是错误仍然存​​在。可能是什么呢? 问题答案: 从Django文档中: SQLite是一个轻量级的数据库,因此不支持高级别的并发性。OperationalError:数据库已锁定错误,表明你的应用程序并发性超过sqlite在默认配置下无法处理的并发性。此错误意味着一个线程或进程在数据库连接

  • 我有片段,我在每个片段中缓存数据。我将数据缓存在AsyncTask中,方法是从服务器上以doInBackground方法下载数据,并将其保存在onPostExecute中到我的数据库中。因此,我总是在onPostExecution中打开数据库连接。如果我滚动“fast”并抛出片段,我认为AsyncTasks会传递预览实例,并且在我打开连接的行中会出现一个<code>android.database

  • 问题内容: 我的Java程序想要读取一个文件,该文件可以被另一个写入该文件的程序锁定。我需要检查文件是否已锁定,如果已锁定,请等待它释放。我该如何实现? Java程序在Windows 2000服务器上运行。 问题答案: 在带有Sun JVM的Windows下,尽管JavaDoc保留了相当模糊的可靠性(取决于系统),但FileLocks应该可以正常工作。 但是,如果您只需要在Java程序中识别出 其