SQLITE_BUSY The database file is locked (database is locked) in wicket

梦想与她 提交于 2019-11-26 09:58:44

问题


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)


回答1:


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.




回答2:


(...) 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


来源:https://stackoverflow.com/questions/8559623/sqlite-busy-the-database-file-is-locked-database-is-locked-in-wicket

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!