Sqlite – paralleler Zugriff mit verschiedenen Prozessen

Veröffentlicht von

Sqlite und paralleler Zugriff mit verschiedenen Threads und Prozessen.

Aktuell verwende ich in einem Projekt Sqlite als Datenbank. Anforderung ist, dass zwei Prozesse sich eine Datenbank teilen. Nun ist Sqlite kein Datenbankserver wie MySQL, sondern halt mehr oder weniger eine Datei im Dateisystem. Grundsätzlich geht es mit dem Zugriff von mehreren Prozessen, aber allerorten liest man, dass es nicht unbedingt die beste Idee ist. Beim Schreiben wird zudem die Datei gelockt.

Ich habe daher mal etwas experimentiert und hier ein paar Erkenntnisse. Im ersten Schritt habe ich eine einfache Datenbankanwendung erstellt, welche in einer Schleife einen Log-Text in eine Sqlite Datenbank schreibt. Den Quelltext gibt es hier.

Der erste Versuch bestand einfach darin die Verbindung zu öffnen und beide Prozesse die Datenbank bearbeiten zu lassen.

public void connect() throws SQLException {
    org.sqlite.SQLiteConfig config = new org.sqlite.SQLiteConfig();
    config.enforceForeignKeys(true);

    var connString = "jdbc:sqlite:db.sqlite";
    _connection = config.createConnection(connString);
}

Das ging recht schnell in die Hose und es kam die Fehlermeldung „[SQLITE_BUSY] The database file is locked (database is locked]“.

Statements und Results schließen

Dies lässt sich umgehen, indem die Verbindung jeweils nach den Operationen geschlossen wird. Alternativ sollten auch die PreparedStatements und die ResultSets geschlossen werden.

statement.close();
result.close();

Anschließend konnte beide Prozesse auf die Datenbank zugreifen und auch parallel schreiben.

Sqlite bietet auch noch Verbindungseinstellungen bzw. Konfigurationsmöglichkeiten.

org.sqlite.SQLiteConfig config = new org.sqlite.SQLiteConfig();
config.enforceForeignKeys(true);
config.setSynchronous(SQLiteConfig.SynchronousMode.FULL);
config.setJournalMode(SQLiteConfig.JournalMode.WAL);
config.enableFullSync(true);

var connString = "jdbc:sqlite:db.sqlite";
_connection = config.createConnection(connString);

Diese bringen alleine nicht so viel, der Schlüssel ist in der Tat eher die Verbindungen zu schließen, bzw. die Statements und ResultSets.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.