6 votes

SQLITE_BUSY Le fichier de la base de données est verrouillé (la base de données est verrouillée) dans wicket

Je fais un projet en wicket Comment résoudre le problème. Je suis tombé sur un tel message : WicketMessage : Can't instantiate page using constructor public itucs.blg361.g03.HomePage()

Cause profonde :

java.lang.UnsupportedOperationException : [SQLITE_BUSY] Le fichier de la base de données est verrouillé (la base de données est verrouillée) 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)

16voto

Jan Hudec Points 27417

Sqlite ne permet qu'un seul écrivain à la fois sur l'ensemble de la base de données et, à moins que vous n'ayez sélectionné le mode journal "WAL", aucun lecteur pendant l'écriture. De plus, à moins que vous ne lui demandiez explicitement d'attendre, il renvoie simplement l'état SQLITE_BUSY pour toute tentative d'accès à la base de données alors qu'une opération conflictuelle est en cours.

Vous pouvez dire à sqlite d'attendre que la base de données devienne disponible pendant une durée déterminée. L'API de niveau C est sqlite3_busy_timeout Je n'ai jamais utilisé sqlite depuis Java, donc je ne sais pas où le trouver.

8voto

Stephan Points 10596

(...) dit à sqlite d'attendre que la base de données devienne disponible pendant le temps spécifié.

Pour le faire à partir de Java, exécutez l'instruction suivante comme une simple instruction SQL :

pragma busy_timeout=30000; -- Busy timeout set to 30000 milliseconds

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X