SQLITE_BUSY The database file is locked (database

2019-01-06 22:54发布

I am doing a project in wicket How to solve the problem. I came across such a message: WicketMessage: Can't instantiate page using constructor public itucs.blg361.g03.HomePage()

Root cause:

java.lang.UnsupportedOperationException: [SQLITE_BUSY] The database file is locked (database is locked) at itucs.blg361.g03.CategoryEvents.CategoryEventCollection.getCategoryEvents(CategoryEventCollection.java:41)

 public List<CategoryEvent> getCategoryEvents() {
    List<CategoryEvent> categoryEvents = new 
            LinkedList<CategoryEvent>();
    try {
        String query = "SELECT id, name, group_id"
                + " FROM event_category";
        Statement statement =  this.db.createStatement();
        ResultSet result = statement.executeQuery(query);
        while (result.next()) {
            int id = result.getInt("id");
            String name = result.getString("name");
            int group_id = result.getInt("group_id");
            categoryEvents.add(new CategoryEvent(id, name, group_id));
        }
    } catch (SQLException ex) {
        throw new UnsupportedOperationException(ex.getMessage());
    }
        return categoryEvents;  
}

at itucs.blg361.g03.HomePage.(HomePage.java:71)

        categories = categoryCollection.getCategoryEvents();

at java.lang.reflect.Constructor.newInstance(Constructor.java:525)

2条回答
Luminary・发光体
2楼-- · 2019-01-06 23:21

(...) tell sqlite to wait for the database to become available for specified amount of time.

In order to do it from Java, run the following statement just like a simple SQL statement:

pragma busy_timeout=30000; -- Busy timeout set to 30000 milliseconds
查看更多
做个烂人
3楼-- · 2019-01-06 23:43

Sqlite allows only one writer to the whole database at a time and, unless you selected "WAL" journal mode, no reader while writing. Moreover unless you explicitly ask it to wait, it simply returns the SQLITE_BUSY status for any attempt to access the database while conflicting operation is running.

You can tell sqlite to wait for the database to become available for specified amount of time. The C-level API is sqlite3_busy_timeout; I never used sqlite from Java though, so I don't know where to find it there.

查看更多
登录 后发表回答