2012-06-21 43 views
5

我有一个单线程应用程序,它在本地文件系统上的3个不同文件中使用3个SQLite数据库。为什么我会得到SQLException:数据库被锁定在我的JDBC SQLite数据库上?

我创建了一个DbAdapter帮助程序类,它打开与SQLite数据库文件的连接。在这个类中,我有一个创建连接的方法open,和一个释放所有内容的方法close

这3个数据库是从派生出DbAdapter的类访问的。

在我的程序中的每个数据库的访问是这样的:

MyDbAdapter DB = new MyDBAdapter(); 
int stuff = DB.getStuff(); // queries the database 
DB.close(); 
// now do something with `stuff` 

我已经登录到stdout到​​和DbAdapter.close所有通话。每当有一个open(),一个close()紧随其后。
我也小心关闭我所有的Statement(这将导致关联的ResultSet也被关闭)。

所以我想我的数据库访问是干净的,因为我试图让他们尽可能短,并且我在不再需要它们时立即释放所有资源。

然而,我仍然得到java.sql.SQLException: database is locked

有没有什么我不正确的做法?我知道我没有显示任何代码,但是我不得不发布很多代码,它不会相关。我只是问我是否在这里使用最佳实践,因为我认为我这样做,而且我仍然遇到例外情况。

这是与Java 1.6,Xerial.org的sqlite的-JDBC-3.7.2驱动程序,在Mac OS 10.6的x64

+0

可能是旧的应用程序正在运行吗?重新启动后这仍然会出现吗?因为据我所知这是每个嵌入式数据库的一个进程不是一个线程.... – Thihara

+0

可能重复[java.sql.SQLException:数据库锁定](http://stackoverflow.com/questions/2578623/java-sql- sqlexception-database-locked) –

+0

@Thihara:我已经'kill'了所有的java进程,仍然 –

回答

2

我注意到,我有奇怪的Java进程,我不能杀了。我跑了:

ps aux | grep java | grep -v grep | awk '{print$2}' | xargs sudo kill -9 

但这些进程仍然在这里(具有相同的PID)。

我重新启动,问题不再出现。这没有意义,因为我能够在没有任何崩溃的情况下进行大量的数据库调用,只有一个调用导致异常。我不明白发生了什么,但我不再有这个问题。

任何回答欢迎。

+1

告诉你:-P我认为有一些旧的流程遗留下来的一些流氓流程。这在我身上也发生过几次。但是,在那些忘记将EXIT_ON_CLOSE应用程序设置为主JFrame的GUI应用程序中。至于我不是Linux大师的原因。可能是你在SuperUser会有更好的运气。 – Thihara

+0

是的,你是对的。我不认为它们影响我的应用程序,因为可执行文件只是'(java)'而不是'/ path/to/java/executable -arg1 -arg2 ...'。这就是Mac OS,但不是Linux! Unix;) –

0

从话题java.sql.SQLException: database locked

引用“读SQLite数据库设置锁定状态共享。多个阅读器可以同时处于活动状态。

写入SQLite数据库会将锁定状态设置为Exclusive。当时没有其他进程可以处于活动状态。

你可以找到http://www.sqlite.org/lockingv3.html详细的解释“

我觉得这是你的问题

+1

这怎么可能是我的问题?事实上,一旦我不再需要它,连接到数据库就会关闭,并且因为我的应用程序是单线程的,所以无法进行并发访问。 –

0

在我的情况下,这个问题是由于尝试从Java更新数据库,同时让它在SQLite数据库浏览器中打开(它似乎对数据库持有一个锁)。