首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用select语句锁定获取[SQLITE_BUSY]数据库文件

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

Stack Overflow用户
提问于 2012-12-15 17:24:07
回答 11查看 69.2K关注 0票数 37

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

代码语言:javascript
复制
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数据库,但我只能从数据库读取。那么为什么我会收到这个错误消息呢?

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

代码语言:javascript
复制
<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>

设置为:Java1.6、Tomcat7.0.34、Spring3.2、Hibernate 3.6.9和sqlite3 3.7.2

问候罗杰

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-12-15 19:48:36

通过谷歌搜索,我发现在连接到SQLite时使用多个连接是一种糟糕的做法。看见

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

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

票数 27
EN

Stack Overflow用户

发布于 2014-06-16 02:27:27

您的应用程序应该只有一个连接。您可以使用此选项来确保。

代码语言:javascript
复制
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;
    }
}
票数 12
EN

Stack Overflow用户

发布于 2014-10-22 04:12:32

另请注意,如果您意外忘记关闭连接,则可能会发生这种情况:

代码语言:javascript
复制
Connection connection;
try {
  Statement statement = connection.createStatement();
  ResultSet resultSet = statement.executeQuery(QUERY);
  if (resultSet.next()) { /* do something */ }
catch (SQLException e) { /* handle exception */ }
finally {
  if (connection != null) {
    try {
      connection.close(); // <-- This is important
    } catch (SQLException e) {
      /* handle exception */
    }
  }
}

虽然第一个数据库连接在服务器启动后可能运行良好,但后续查询可能不会正常工作,这取决于连接池的配置方式。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13891006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档