Zum Inhalt springen

Wie Raima Database Manager SQLite schlägt

4 Top-Herausforderungen mit SQLite und wie Raima Database Manager sie vermeidet

Herausforderung 1: Skalierbare Leistung

SQLite ist mit Leistungsproblemen konfrontiert, da dem System aufgrund des "One Write at a Time" - und Single-Thread-Designs mehr Benutzer und / oder zusätzliche Hardware hinzugefügt werden.

RDM kennt keine Grenzen

RDM Dieses Problem tritt nicht auf, da die Leistung verbessert wird, wenn Sie bessere Hardware und Benutzer hinzufügen. RDM wurde optimiert, um zusätzliche Hardware zu skalieren und zu verwenden, die dem RDM-System hinzugefügt wurde. Zusätzliche Benutzer haben auch eine sehr stabile und konsistente Leistung.  SQLiteGibt einem zufälligen Benutzer von Natur aus Priorität. Dies macht die Leistung einiger Benutzer viel besser als andere.

Herausforderung 3: Lebensdauer von Flash-Medien

SQLite ist nicht für die Speicherung von Flash-Medien optimiert.

Optimiert für Flash Media

RDM optimiert und minimiert die Anzahl der Schreibvorgänge auf das Speichermedium und verlängert so die Lebensdauer des Geräts. Dies bedeutet, dass während der gesamten Lebensdauer der Anwendung weniger Wartung und weniger Austausch erforderlich sind. Darüber hinaus bietet RDM auf diesen Geräten aufgrund der Optimierungen eine bessere Leistung.

Herausforderung 2: Plattformunterstützung

SQLite unterstützt nicht so viele Plattformen wie RDM.

Plattformunabhängigkeit

RDM unterstützt nahezu jede Hardwarekombination und jedes Betriebssystem. Es wurde für die Ausführung in jeder Umgebung optimiert. RDM kann sogar ohne Betriebssystem in einer Bare-Bones-Konfiguration ausgeführt werden.

Herausforderung 4: Integration der Entwicklungsumgebung

SQLite enthält keine integrierten Projektdateien und unterstützt nicht alle Standardentwicklungsumgebungen.

Out of the Box

Die RDM-Unterstützung umfasst Visual Studio, XCode, Makefiles, CMake, Wind River Workbench und Green Hills MULTI mit vorgefertigten Projektdateien und Integrationen der Entwicklungsumgebung.

Wechseln Sie aus Gründen der Skalierbarkeit und Leistung von SQLite zu RDM

Raima Database Manager unterstützt nahezu dieselbe SQL-Ebene wie SQLite. So, Der Benutzer müsste nur den Inhalt des exportierenir Datenbank in einem CSV-, XML- oder SQL-Format ausführenrdm-erstellenFühren Sie dann die Datenbankschemadatei ausrdm-importierenin der CSV-, XML- oder SQL-Formatdatei und der Benutzer wird ein RDM haben, das der SQLite-Datenbank entspricht. Von dort, der Benutzer Möglicherweise muss Ihre Anwendung portiert werden, aber RDM unterstützt die ODBC-SQL-Schnittstelle, die JDBC-Java-Schnittstelle und die ADO.NET C#-Schnittstelle, sodass möglicherweise keine wesentlichen Codeänderungen erforderlich sind. Sehen Migrationsanleitung.

Beispiel für einen Leistungsvergleich - Raima Database Manager (RDM) vs. SQLite

Der Großteil des heutigen Betriebssystems und der Hardware unterstützt Multithreading. SQLite nutzt diese Möglichkeit aufgrund des Designs in SQLite nicht. Wenn viele Schreibvorgänge gleichzeitig in eine SQLite-Datenbank geschrieben werden, wird die Geschwindigkeit der Anwendungsbenutzer erheblich verringert, und die Anwendung erfüllt möglicherweise nicht die Leistungserwartungen der Benutzer. Es ist bekannt, dass der Schreibzugriff auf die SQLite-Datenbank nur gewährt werden kann, wenn keine anderen Anforderungen bearbeitet werden. Es ist das "One Write at a Time" -Design in SQLite, das den Durchsatz verlangsamt. Daher sind viele Anwendungsinhaber gezwungen, nach Alternativen zu suchen eingebettete Datenbank Optionen zur Behebung ihres Leistungsengpasses.

Raima hat einen Test zusammengestellt, der die Unterschiede zwischen der RDM-Datenbanklösung und SQLite belegt. In diesem Test zeigen wir, dass RDM eine gute Alternative zu SQLite ist.

 

Wie wir den Test gemacht haben

In diesem Leistungsvergleich haben wir einen Standard verwendetTPC-BTest-Framework von www.tpc.org. Der TPC-B misst den Durchsatz anhand der Anzahl der Transaktionen pro Sekunde, die das System ausführen kann. Der Test wurde geändert, um Vergleiche zu ermöglichen, bei denen mehrere Clients parallel arbeiten.

Wir haben für SQLite und RDM dieselbe Testumgebung und dasselbe Framework verwendet. Im Test erwies sich RDM als deutlich schneller als SQLite. Siehe Abbildung unten. Die für den Test verwendete Plattform war RDM Release 14.1, das unter SQLite v3.23 auf einem Standard-Windows 10-, Intel i7-Prozessorcomputer mit 16 GB RAM und einer Standard-SATA-Festplatte ausgeführt wurde.

Raima Database Manager verfügt über ein Design, das für optimiert ist eingebettet Systeme mit einem modernen und effizienten Satz von APIs sowie einem gut gestalteten Datenbankspeicher-Dateiformat. RDM ermöglicht gleichzeitiges Schreiben und Lesen und kann daher viel mehr Arbeit leisten als SQLite.

Testhighlights:
Aufgrund der Multithread-Unterstützung von RDM führt RDM im Vergleich zu SQLite eine wesentlich höhere Anzahl von Transaktionen aus.

In der folgenden Abbildung überträgt RDM die vierfache Anzahl von Transaktionen, die SQLite innerhalb des gleichen Zeitrahmens und der gleichen Hardwareeinschränkungen ausführen kann. Wenn dieser Test mit einem durchgeführt wird in Erinnerung Design macht sich der Unterschied noch deutlicher bemerkbar.

 

Die Aufschlüsselung des obigen Tests zeigt weiter die Anzahl der Transaktionen, die pro Sekunde auf jedem Client der Datenbank ausgeführt werden.

Fazit

Wie in der obigen Abbildung gezeigt, verfügt SQLite aufgrund seines Entwurfs über eine variable Anzahl von Transaktionen, die pro Sekunde auf jedem Client der Datenbank ausgeführt werden können. RDM erhöht die Anzahl der Transaktionen pro Sekunde und Client um das Vierfache. Wenn Stabilität und Konsistenz wichtig sind, passt RDM hervorragend.

RDM wurde entwickelt, um konsistente und zuverlässige Transaktionen pro Sekunde zu liefern und gleichzeitig benutzerfreundlich und effizient zu sein.

Weitere Benchmarks für Leistungstests Klicke hier

Bereit anzufangen?

So migrieren Sie von SQLite zu RDM, um Skalierbarkeit und Leistung zu gewährleisten

H.dank migrieren nach RDM in Ordnung die Vorteile ausprobieren? Die Antwort ist einfacher als Sie kann erwarten von. RDM unterstützt nahezu dieselbe SQL-Ebene wie SQLite. So, Der Benutzer müsste nur den Inhalt des exportierenir Datenbank in einem CSV-, XML- oder SQL-Format ausführenrdm-erstellenFühren Sie dann die Datenbankschemadatei ausrdm-importierenin der CSV-, XML- oder SQL-Formatdatei und der Benutzer wird ein RDM haben, das der SQLite-Datenbank entspricht. Von dort, der Benutzer Möglicherweise muss Ihre Anwendung portiert werden, aber RDM unterstützt die ODBC-SQL-Schnittstelle, die JDBC-Java-Schnittstelle und die ADO.NET C#-Schnittstelle, sodass möglicherweise keine wesentlichen Codeänderungen erforderlich sind. 

FunktionenSQLite-Syntax / LogikRaima Syntax / LogikAnmerkungen
Initialisierungint sqlite3_config (int, ...) - Wird verwendet, um globale Konfigurationsänderungen an SQLite vorzunehmen, um SQLite an die spezifischen Anforderungen der Anwendung anzupassen.SQLSetConnectAttr () Verwenden Sie unsere vom Treiber definierten Attribute, um verbindungsbasierte Konfigurationsoptionen festzulegen.SQLite Liste der Konfigurationsoptionen

Raima Liste der Optionen
Öffnen Sie die DB-Verbindungsqlite3_open ("test.db", & db);SQLAllocHandle (), gefolgt von SQLConnect (). Sobald eine Verbindung hergestellt wurde, geben Sie "USE" aus "Befehl mit SQLExecute () oder SQLExecDirect ().SQLite ermöglicht mehrere Datenbankdateien mit einer einzigen Verbindung über die ATTACH DATABASE-Anweisung
IN-MEMORY-DatenbankenVerwenden Sie die Option ": memory:".
sqlite3_open (": memory:", & db);
Setzen Sie das Verbindungsattribut SQL_ATTR_RDM_STORAGE_MEDIA durch Aufrufen auf "INMEMORY_KEEP" SQLSetConnectAttr ().SQLite speichert keine speicherinterne Datenbank auf der Festplatte!
Raima bietet Ihnen die Möglichkeit, auf Festplatte zu speichern.
Führen Sie SQL aus(i) Bereiten Sie zuerst die Erklärung vor
int sqlite3_prepare(
sqlite3 * db, / * Datenbankhandle * /
const char * zSql, / * SQL-Anweisung, UTF-8-codiert * /
int nByte, / * Maximale Länge von zSql in Bytes. * /
sqlite3_stmt ** ppStmt, / * OUT: Anweisungshandle * /
const char ** pzTail / * OUT: Zeiger auf nicht verwendeten Teil von zSql * /
);

(ii) Dann ausführen mit
int sqlite3_step (sqlite3_stmt *)
(i) Ausführen mit SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength).

(ii) Vorbereiten mit SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength) und dann ausführen mit SQLExecute(SQLHSTMT StatementHandle).
Abhängig von der Codierung kann SQLite verwenden sqlite3_prepare16 () für UTF-16-Codierung und int sqlite3_prepare16_v3 ()
Bindungsparametersqlite3_bind_ * -Familie von Funktionen wird verwendet; z.B
int sqlite3_bind_double (sqlite3_stmt *, int, double);
int sqlite3_bind_int (sqlite3_stmt *, int, int);
int sqlite3_bind_null (sqlite3_stmt *, int);
int sqlite3_bind_text (sqlite3_stmt *, int, const char *, int, void (*) (void *));
int sqlite3_bind_pointer (sqlite3_stmt *, int, void *, const char *, void (*) (void *));
int sqlite3_bind_zeroblob (sqlite3_stmt *, int, int n);
SQLBindParameter (
SQLHSTMT StatementHandle,
SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputType,
SQLSMALLINT ValueType,
SQLSMALLINT ParameterType,
SQLUINTEGER LengthPrecision,
SQLSMALLINT ParameterScale,
SQLPOINTER ParameterValue,
SQLLEN ValueSize,
SQLLEN * StrLen_or_Ind
);
Anruf SQLParamData () und SQLPutData () zum Verarbeiten von Data-at-Exec-Blob-Parametern, die in Anweisungen zum Einfügen und Aktualisieren angegeben sind.
Raima benutzt SQLBindCol () um eine Anwendungsvariable an die Spalte zu binden.

Um in SQLite eine vorbereitete Anweisung auf den Anfangszustand zurückzusetzen, verwenden Sie: sqlite3_reset (sqlite3_stmt * pStmt)
TransaktionenVerwendet die Befehle BEGIN-TRANSACTION, DEFERRED / IMMEDIATE / EXCLUSIVE, END-TRANSACTION oder COMMIT, SAVEPOINT und ROLLBACK(i) Verwenden Sie die Befehle "START TRANSACTION", "COMMIT", "ROLLBACK", "SAVEPOINT" und "ROLLBACK".

(ii) Rufen Sie an SQLEndTran () festschreiben oder zurücksetzen. "
Ergebnismenge abrufenint sqlite3_step(sqlite3_stmt *)SQLFetch () oder SQLFetchScroll () um die nächste Reihe von Zeilen aus der Ergebnismenge abzurufen. Rufen Sie auf, um BLOB-Daten in Blöcken abzurufen SQLGetData ().Beide DBs können Next-ROW- oder Fehlercodes zurückgeben (siehe unten).
Greifen Sie auf eine Spalte in einer Zeile zusqlite3_column Funktionsfamilie(i) Greifen Sie auf die Spaltenwerte zu, die in Anwendungsvariablen abgerufen wurden, die mit festgelegt wurden SQLBindCol () vor dem Abrufen.

(ii) Rufen Sie an SQLGetData () auf der / den gewünschten Spalte (n).
SQLite verwendet Funktionen, die auf dem Spaltentyp basieren. doppelt sqlite3_column_double(sqlite3_stmt *, int iCol) oder int sqlite3_column_int(..) oder int sqlite3_column_bytes(..)
Abschlusserklärungsqlite3_finalize(sqlite3_stmt * pStmt) zerstört eine vorbereitete Anweisung und gibt ihre Ressourcen freiAnruf SQLFreeHandle () auf dem Anweisungshandle, um alle seine Ressourcen freizugeben.
Schließen Sie eine Datenbankverbindung / ein Datenbankhandleint sqlite3_close(sqlite3 *) und int sqlite3_close_v2(sqlite3 *)SQLFreeHandle () um die Verbindungs- und Umgebungshandles freizugeben. Dadurch werden alle mit der Verbindung verknüpften Datenbankhandles freigegeben.In SQLite ist besser zu verwenden sqlite3_close_v2 wie es für die Verwendung mit Host-Sprachen vorgesehen ist, bei denen Müll gesammelt wird und bei denen die Reihenfolge, in der Destruktoren aufgerufen werden, willkürlich ist.
AufbauDas sqlite3_config () Die Schnittstelle wird verwendet, um globale Konfigurationsänderungen an SQLite vorzunehmen, um SQLite an die spezifischen Anforderungen der Anwendung anzupassen.Verwendet ein Konfigurationsskript zum Festlegen von Umgebungsvariablen.
Verschlüsselungint sqlite3_key(sqlite3 * db, const void * pKey, int nKey);

int sqlite3_rekey(sqlite * db,
const void * pKey, int nKey / * Der neue Schlüssel * /
);
Anruf rdm_tfsAllocEncrypt(
const char * passcode,
RDM_ENCRYPT * enc
), um ein Encyprtion-Objekt zu erstellen.

Übergeben Sie das Verschlüsselungsobjekt an SQLSetConnectAttr () Verwenden des Attributs SQL_ATTR_RDM_ENCRYPT.
SQLite verwendet die kostenpflichtige SQLite Encryption Extension (SEE).

Raima verwendet den AES-Verschlüsselungsschlüssel mit Unterstützung für mehrere Schlüsselgrößen (128, 192 und 256 Bit).
IsolationUnterstützt "Serialisierbare Isolierung" , Aber im Write-Ahead-WAL-Modus bietet es "Schnappschuss-Isolierung".Unterstützt "Serialisierbare Isolierung"
FunktionenSQLite-Syntax / LogikRaima Syntax / LogikAnmerkungen
Initialisierungint sqlite3_config (int, ...) - Wird verwendet, um globale Konfigurationsänderungen an SQLite vorzunehmen, um SQLite an die spezifischen Anforderungen der Anwendung anzupassen.SQLSetConnectAttr () Verwenden Sie unsere vom Treiber definierten Attribute, um verbindungsbasierte Konfigurationsoptionen festzulegen.SQLite Liste der Konfigurationsoptionen

Raima Liste der Optionen
Öffnen Sie die DB-Verbindungsqlite3_open ("test.db", & db);SQLAllocHandle (), gefolgt von SQLConnect (). Sobald eine Verbindung hergestellt wurde, geben Sie "USE" aus "Befehl mit SQLExecute () oder SQLExecDirect ().SQLite ermöglicht mehrere Datenbankdateien mit einer einzigen Verbindung über die ATTACH DATABASE-Anweisung
IN-MEMORY-DatenbankenVerwenden Sie die Option ": memory:".
sqlite3_open (": memory:", & db);
Setzen Sie das Verbindungsattribut SQL_ATTR_RDM_STORAGE_MEDIA durch Aufrufen auf "INMEMORY_KEEP" SQLSetConnectAttr ().SQLite speichert keine speicherinterne Datenbank auf der Festplatte!
Raima bietet Ihnen die Möglichkeit, auf Festplatte zu speichern.
Führen Sie SQL aus(i) Bereiten Sie zuerst die Erklärung vor
int sqlite3_prepare(
sqlite3 * db, / * Datenbankhandle * /
const char * zSql, / * SQL-Anweisung, UTF-8-codiert * /
int nByte, / * Maximale Länge von zSql in Bytes. * /
sqlite3_stmt ** ppStmt, / * OUT: Anweisungshandle * /
const char ** pzTail / * OUT: Zeiger auf nicht verwendeten Teil von zSql * /
);

(ii) Dann ausführen mit
int sqlite3_step (sqlite3_stmt *)
(i) Ausführen mit SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength).

(ii) Vorbereiten mit SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength) und dann ausführen mit SQLExecute(SQLHSTMT StatementHandle).
Abhängig von der Codierung kann SQLite verwenden sqlite3_prepare16 () für UTF-16-Codierung und int sqlite3_prepare16_v3 ()
Bindungsparametersqlite3_bind_ * -Familie von Funktionen wird verwendet; z.B
int sqlite3_bind_double (sqlite3_stmt *, int, double);
int sqlite3_bind_int (sqlite3_stmt *, int, int);
int sqlite3_bind_null (sqlite3_stmt *, int);
int sqlite3_bind_text (sqlite3_stmt *, int, const char *, int, void (*) (void *));
int sqlite3_bind_pointer (sqlite3_stmt *, int, void *, const char *, void (*) (void *));
int sqlite3_bind_zeroblob (sqlite3_stmt *, int, int n);
SQLBindParameter (
SQLHSTMT StatementHandle,
SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputType,
SQLSMALLINT ValueType,
SQLSMALLINT ParameterType,
SQLUINTEGER LengthPrecision,
SQLSMALLINT ParameterScale,
SQLPOINTER ParameterValue,
SQLLEN ValueSize,
SQLLEN * StrLen_or_Ind
);
Anruf SQLParamData () und SQLPutData () zum Verarbeiten von Data-at-Exec-Blob-Parametern, die in Anweisungen zum Einfügen und Aktualisieren angegeben sind.
Raima benutzt SQLBindCol () um eine Anwendungsvariable an die Spalte zu binden.

Um in SQLite eine vorbereitete Anweisung auf den Anfangszustand zurückzusetzen, verwenden Sie: sqlite3_reset (sqlite3_stmt * pStmt)
TransaktionenVerwendet die Befehle BEGIN-TRANSACTION, DEFERRED / IMMEDIATE / EXCLUSIVE, END-TRANSACTION oder COMMIT, SAVEPOINT und ROLLBACK(i) Verwenden Sie die Befehle "START TRANSACTION", "COMMIT", "ROLLBACK", "SAVEPOINT" und "ROLLBACK".

(ii) Rufen Sie an SQLEndTran () festschreiben oder zurücksetzen. "
Ergebnismenge abrufenint sqlite3_step(sqlite3_stmt *)SQLFetch () oder SQLFetchScroll () um die nächste Reihe von Zeilen aus der Ergebnismenge abzurufen. Rufen Sie auf, um BLOB-Daten in Blöcken abzurufen SQLGetData ().Beide DBs können Next-ROW- oder Fehlercodes zurückgeben (siehe unten).
Greifen Sie auf eine Spalte in einer Zeile zusqlite3_column Funktionsfamilie(i) Greifen Sie auf die Spaltenwerte zu, die in Anwendungsvariablen abgerufen wurden, die mit festgelegt wurden SQLBindCol () vor dem Abrufen.

(ii) Rufen Sie an SQLGetData () auf der / den gewünschten Spalte (n).
SQLite verwendet Funktionen, die auf dem Spaltentyp basieren. doppelt sqlite3_column_double(sqlite3_stmt *, int iCol) oder int sqlite3_column_int(..) oder int sqlite3_column_bytes(..)
Abschlusserklärungsqlite3_finalize(sqlite3_stmt * pStmt) zerstört eine vorbereitete Anweisung und gibt ihre Ressourcen freiAnruf SQLFreeHandle () auf dem Anweisungshandle, um alle seine Ressourcen freizugeben.
Schließen Sie eine Datenbankverbindung / ein Datenbankhandleint sqlite3_close(sqlite3 *) und int sqlite3_close_v2(sqlite3 *)SQLFreeHandle () um die Verbindungs- und Umgebungshandles freizugeben. Dadurch werden alle mit der Verbindung verknüpften Datenbankhandles freigegeben.In SQLite ist besser zu verwenden sqlite3_close_v2 wie es für die Verwendung mit Host-Sprachen vorgesehen ist, bei denen Müll gesammelt wird und bei denen die Reihenfolge, in der Destruktoren aufgerufen werden, willkürlich ist.
AufbauDas sqlite3_config () Die Schnittstelle wird verwendet, um globale Konfigurationsänderungen an SQLite vorzunehmen, um SQLite an die spezifischen Anforderungen der Anwendung anzupassen.Verwendet ein Konfigurationsskript zum Festlegen von Umgebungsvariablen.
Verschlüsselungint sqlite3_key(sqlite3 * db, const void * pKey, int nKey);

int sqlite3_rekey(sqlite * db,
const void * pKey, int nKey / * Der neue Schlüssel * /
);
Anruf rdm_tfsAllocEncrypt(
const char * passcode,
RDM_ENCRYPT * enc
), um ein Encyprtion-Objekt zu erstellen.

Übergeben Sie das Verschlüsselungsobjekt an SQLSetConnectAttr () Verwenden des Attributs SQL_ATTR_RDM_ENCRYPT.
SQLite verwendet die kostenpflichtige SQLite Encryption Extension (SEE).

Raima verwendet den AES-Verschlüsselungsschlüssel mit Unterstützung für mehrere Schlüsselgrößen (128, 192 und 256 Bit).
IsolationUnterstützt "Serialisierbare Isolierung" , Aber im Write-Ahead-WAL-Modus bietet es "Schnappschuss-Isolierung".Unterstützt "Serialisierbare Isolierung"

RDM verfügt über eine flexible Architektur und hohe Leistung