获取 \[SQLITE_BUSY\] 数据库文件被 select 语句锁定

新手上路,请多包涵

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

 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

问候罗杰

原文由 rogergl 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 962
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;
    }
}

原文由 bowman han 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题