【问题标题】:Sqlite problems: database file is lockedSqlite 问题:数据库文件被锁定
【发布时间】:2016-08-30 08:58:57
【问题描述】:

我有一个包含多个表的 sqlite 数据库。其中之一称为学生会话。在我的代码中,我多次调用表进行选择、插入、更新。过了一会儿,我收到了消息:

java.sql.SQLException: [SQLITE_BUSY] 数据库文件被锁定(数据库被锁定)

调用的一个实例如下:

    String query3 = "select * from studentssession where id= ?  and math= ? and level = ?";
    PreparedStatement pst__ = connectionUsers.prepareStatement(query3);
    pst__.setString(1, x);
    pst__.setString(2, x1);
    pst__.setString(3, x2); 
    ts2 = pst__.executeQuery();

我试图弄清楚我是否必须每次都关闭准备好的语句,以及是否存在导致我的问题的情况。

编辑:是否可以检查数据库中可能打开的引用,例如使用 javafxbutton?

编辑:有没有一种方法可以检查我的代码中对表的引用是否存在问题并找到并可能关闭它们?

【问题讨论】:

  • 这可能是由于您对 sqlite 数据库有多个打开的引用。
  • 是的,这是真的,但我怎样才能将它们全部关闭?我的意思是有没有办法对所有这些引用进行检查?这有可能与准备好的语句有关吗?
  • 关闭你的代码 pst__.connection.close();
  • 我必须对每个语句都这样做,或者当我的程序关闭时?
  • 对于每个语句。

标签: java mysql sqlite


【解决方案1】:

这可能是由于您对 sqlite 数据库有多个打开的引用。 我将首先在您的 while 循环内的 finally 块中关闭您的 PreparedStatement。

PreparedStatement pst__ = null;
try{   
  pst__ = connectionUsers.prepareStatement(query3);
  pst__.setString(1, x);
  pst__.setString(2, x1);
  pst__.setString(3, x2); 
  ts2 = pst__.executeQuery();
}finally{
  if(pst__ != null) {
    pst__.close();
  }
}

您还应该在所有操作结束时关闭数据库连接。

在连接到 SQLite 时使用多个连接也是一种不好的做法。见

http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking

将您的 poolsize maxactive 设置为 1 并尝试一下。

【讨论】:

  • 应该是pst__.close();或 pst__.connection.close();正如 ahmad 在 cmets 中提议的那样?
  • 是否可以检查可能的开放引用?
猜你喜欢
  • 2019-02-05
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多