获取 [SQLITE_BUSY] 数据库文件已使用 select 语句锁定

2022-09-01 03:47:03

如果我对我的Web应用程序运行多个线程,我会得到:

java.sql.SQLException: [SQLITE_BUSY]  The database file is locked (database is locked)
    at org.sqlite.DB.newSQLException(DB.java:383)
    at org.sqlite.DB.newSQLException(DB.java:387)
    at org.sqlite.DB.execute(DB.java:339)
    at org.sqlite.PrepStmt.executeQuery(PrepStmt.java:75)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)

我知道只有一个线程可以写入sqlite数据库,但我只从数据库中读取。那么为什么我会收到此错误消息?

顺便说一句:我的连接池如下所示:

<bean class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" id="dataSource">
    <property name="driverClassName" value="${database.driverClassName}" />
    <property name="url" value="${database.url}" />
    <property name="username" value="${database.username}" />
    <property name="password" value="${database.password}" />
    <property name="initialSize" value="1" />
    <property name="maxActive" value="2" />
    <property name="maxIdle" value="1" />
    <property name="poolPreparedStatements" value="true" />
</bean>

设置是:Java 1.6,Tomcat 7.0.34,Spring 3.2,Hibernate 3.6.9和sqlite3 3.7.2

问候罗杰


答案 1

经过一些谷歌搜索,我发现在连接到SQLite时使用多个连接是一种不好的做法。看

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

将池大小最大设置为 1 并试用。


答案 2

与应用程序应该只有一个连接。您可以使用它来确保。

public class SqliteHelper {
private static Connection c = null;
public static Connection getConn() throws Exception {
    if(c == null){
    Class.forName("org.sqlite.JDBC");
    c = DriverManager.getConnection("jdbc:sqlite:D:/test.db");
    }
    return c;
    }
}

推荐