Ich mache Datenbankprogrammierung mit Java mit SQLite.
Ich habe festgestellt, dass jeweils nur eine Verbindung zur Datenbank Schreibfunktionen hat, während viele Verbindungen gleichzeitig Lesefunktionen haben.
Warum wurde die Architektur von SQLite so entworfen? Warum können nicht zwei Schreibvorgänge gleichzeitig ausgeführt werden, solange die beiden zu schreibenden Objekte nicht an derselben Stelle in der Datenbank gespeichert werden?
database
concurrency
sqlite
SteelToe
quelle
quelle
Antworten:
Da "mehrere gleichzeitige Schreibvorgänge" in der Kerndatenbank-Engine sehr viel schwieriger durchzuführen sind als bei einem einzelnen Schreiber und mehreren Lesern. Es geht über die Designparameter von SQLite hinaus und würde wahrscheinlich die erfreulich kleine Größe und Einfachheit von SQLite untergraben.
Die Unterstützung eines hohen Grads an Parallelität beim Schreiben ist ein Kennzeichen großer Datenbankmodule wie DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL und Sybase. Technisch ist dies jedoch schwierig, da umfangreiche Strategien zur Steuerung und Optimierung der Parallelität wie Datenbank-, Tabellen- und Zeilensperrung oder in moderneren Implementierungen die Steuerung der Parallelität für mehrere Versionen erforderlich sind . Die Forschung zu diesem Problem / dieser Anforderung ist umfangreich und reicht Jahrzehnte zurück .
SQLite hat eine ganz andere Designphilosophie als die meisten serverzentrierten DBMS, die mehrere Writer unterstützen. Es wurde entwickelt, um die Leistungsfähigkeit von SQL und des relationalen Modells für einzelne Anwendungen zu nutzen und um tatsächlich in jede Anwendung eingebettet zu werden. Dieses Ziel erfordert erhebliche Kompromisse. Dazu gehört auch, dass nicht die für die Verarbeitung mehrerer gleichzeitiger Writer erforderliche Infrastruktur und der Overhead hinzugefügt werden müssen.
Die Philosophie kann durch eine Erklärung auf der entsprechenden Verwendungsseite von SQLite zusammengefasst werden :
quelle
fopen()
, bedenken Sie also die Haarigkeit, die mit dem gleichzeitigen Schreiben in eine reine Textdatei einhergeht.Weil es keinen Server gibt, der sagen kann, ob Dinge an die gleiche Stelle geschrieben werden sollen oder nicht. Es gibt nur zwei Prozesse, die versuchen, in eine Datei zu schreiben.
Wie in einem Kommentar erwähnt, können gleichzeitige Schreibvorgänge auch von einem internen Thread unterstützt werden. Ich bin mir nicht sicher, wie gut das funktionieren würde (habe auch nicht viel darüber nachgedacht). Wie auch immer, SQLite verwendet hier keine Threads: Dr. Hipp ist der Meinung, dass Threads böse sind.
Die Tatsache, dass DR Hipp der Meinung ist, dass Threads böse sind, ist in den SQLite-FAQ dokumentiert .
quelle