跳到內容

Raima Database Manager如何擊敗SQLite

SQLite面臨的4個主要挑戰以及Raima Database Manager如何避免這些挑戰

挑戰1:可擴展的性能

由於“一次寫入”和單線程設計,隨著更多用戶和/或其他硬件被添加到系統中,SQLite面臨性能問題。

RDM沒有限制

RDM 不會出現此問題,因為當您添加更好的硬件和用戶時其性能會變得更好。 RDM已經過優化,可以擴展和利用添加到RDM系統中的任何其他硬件。其他用戶也具有非常穩定和一致的性能。  SQLite的根據設計,將優先級分配給隨機用戶。這使得某些用戶的性能要比其他用戶好得多。

挑戰3:Flash Media的使用壽命

SQLite尚未針對閃存介質存儲進行優化。

針對Flash媒體進行了優化

RDM優化並最小化了對存儲介質的寫入次數,從而延長了設備的使用壽命。這意味著需要更少的維護,並且在應用程序的整個生命週期內更換的次數更少。此外,由於具有優化功能,RDM在這些設備上的性能更好。

挑戰2:平台支持

SQLite不支持RDM支持的平台。

平台獨立性

RDM支持幾乎每種硬件組合和操作系統。它已經過優化,可以在任何環境中運行。 RDM甚至可以在沒有操作系統的情況下運行。

挑戰4:開發環境集成

SQLite沒有與內置項目文件打包在一起,並且不支持所有標准開發環境。

盒子外面

RDM支持包括Visual Studio,XCode,Makefile,CMake,Wind River Workbench,Green Hills MULTI,以及預打包的項目文件和開發環境集成。

從SQLite切換到RDM,以實現可伸縮性和性能

Raima Database Manager支持與SQLite幾乎相同級別的SQL。 因此, 用戶只需要導出ir 將數據庫轉換為CSV,XML或SQL格式,然後運行rdm-創造在他們的數據庫模式文件上,然後運行rdm-進口在CSV,XML或SQL格式文件上,以及 用戶 將具有與SQLite數據庫等效的RDM。從那裡, 用戶 可能必須移植您的應用程序,但是RDM支持ODBC SQL接口,JDBC Java接口和ADO.NET C#接口,因此可能不必進行實質性的代碼更改。 看 遷移指南。

性能比較示例-Raima數據庫管理器(RDM)與SQLite

當今的大多數操作系統和硬件都支持多線程。 SQLite的 由於SQLite中的設計,因此沒有利用此機會。當有許多並發寫入SQLite數據庫時,應用程序用戶的速度會大大降低,並且應用程序可能無法滿足用戶的性能期望。眾所周知,只有在沒有其他請求得到服務的情況下,才可以授予對SQLite數據庫的寫訪問權限。 SQLite中的“一次寫入一次”設計會減慢吞吐量。因此,許多應用程序所有者被迫尋找替代方案 嵌入式數據庫 解決其性能瓶頸的選項。

Raima進行了一項測試,證明了RDM數據庫解決方案和SQLite之間的差異。在此測試中,我們證明RDM是SQLite的很好替代品。

 

我們如何進行測試

在此性能比較中,我們使用了標準TPC-B來自的測試框架 www.tpc.org。 TPC-B根據系統每秒可以執行多少個事務來衡量吞吐量。對該測試進行了修改,以允許在多個客戶端進行並行工作時進行比較。

我們為SQLite和RDM使用了相同的測試環境和框架。在測試中,事實證明RDM的速度明顯快於SQLite。請參見下圖。該測試使用的平台是在標準Windows 10,具有16GB RAM和標準SATA硬盤的Intel i7處理器計算機上針對SQLite v3.23運行的RDM版本14.1。

Raima Database Manager的設計針對以下情況進行了優化 嵌入式的 系統,其中包含一組現代化,高效的API,以及精心設計的數據庫存儲文件格式。 RDM允許並發寫入和讀取,因此可以完成SQLite可以完成的工作量的許多倍。

測試亮點:
由於RDM的多線程支持,與SQLite相比,RDM將執行大量事務。

在下圖中,RDM將SQLite在相同時間範圍內和硬件約束下可以處理的事務數增加四倍。如果使用 在記憶中 設計上,差異更加明顯。

 

分解上面的測試,進一步顯示每秒在數據庫的每個客戶端上完成的事務數量。

結論

如上圖所示,由於SQLite的設計,它每秒可以在數據庫的每個客戶端上執行的事務數量是可變的。 RDM可以使每個客戶每秒處理的事務數增加多達四倍。如果穩定性和一致性很重要,那麼RDM非常適合。

RDM旨在每秒提供一致且可靠的事務,同時對多用戶友好且高效。

有關更多性能測試基準的信息 點擊這裡

準備開始了嗎?

如何從SQLite遷移到RDM以實現可伸縮性和性能

H由於 遷移到 RDM 為了 嘗試好處?答案比你更直接 可能 預計。 RDM支持與SQLite幾乎相同級別的SQL。 因此, 用戶只需要導出ir 將數據庫轉換為CSV,XML或SQL格式,然後運行rdm-創造在他們的數據庫模式文件上,然後運行rdm-進口在CSV,XML或SQL格式文件上,以及 用戶 將具有與SQLite數據庫等效的RDM。從那裡, 用戶 可能必須移植您的應用程序,但是RDM支持ODBC SQL接口,JDBC Java接口和ADO.NET C#接口,因此可能不必進行實質性的代碼更改。 

職能SQLite語法/邏輯Raima語法/邏輯筆記
初始化int sqlite3_config(int,...) -用於對SQLite進行全局配置更改,以便根據應用程序的特定需求調整SQLite。SQLSetConnectAttr() 並使用我們的驅動程序定義的屬性來設置基於連接的配置選項。SQLite配置選項列表

Raima選項列表
打開數據庫連接sqlite3_open(“ test.db”,&db);SQLAllocHandle(), 其次是 SQLConnect()。建立連接後,發出“ USE ”命令使用 SQLExecute() 或者 SQLExecDirect().SQLite允許通過ATTACH DATABASE語句通過單個連接連接多個數據庫文件
內存數據庫使用“:memory:”選項;
sqlite3_open(“:memory:”,&db);
通過調用將SQL_ATTR_RDM_STORAGE_MEDIA連接屬性設置為“ INMEMORY_KEEP” SQLSetConnectAttr().SQLite不會將內存數據庫保存到磁盤!
Raima使您可以選擇保存到磁盤。
執行SQL(i)首先準備聲明
int sqlite3_prepare(
sqlite3 * db,/ *數據庫句柄* /
const char * zSql,/ * SQL語句,UTF-8編碼* /
int nByte,/ * zSql的最大長度,以字節為單位。 * /
sqlite3_stmt ** ppStmt,/ * OUT:語句句柄* /
const char ** pzTail / * OUT:指向zSql未使用部分的指針* /
);

(ii) 然後執行 使用
int sqlite3_step(sqlite3_stmt *)
(i)執行 SQLExecDirect(SQLHSTMT StatementHandle,SQLCHAR * StatementText,SQLINTEGER TextLength)。

(ii)準備 SQL準備(SQLHSTMT StatementHandle,SQLCHAR * StatementText,SQLINTEGER TextLength),然後使用 SQL執行(SQLHSTMT StatementHandle)。
根據編碼,SQLite可能會使用 sqlite3_prepare16() 用於UTF-16編碼和int sqlite3_prepare16_v3()
綁定參數sqlite3_bind_ *家庭 使用的功能;例如
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
);
稱呼 SQLParamData()SQLPutData() 處理在insert和update語句中指定的執行數據的Blob參數。
Raima的用途 SQLBindCol() 將應用程序變量綁定到列。

在SQLite中,要將使用準備好的語句重置為初始狀態,請使用-sqlite3_reset(sqlite3_stmt * pStmt)
交易次數使用BEGIN-TRANSACTION,DEFERRED / IMMEDIATE / EXCLUSIVE,END-TRANSACTION或COMMIT,SAVEPOINT和ROLLBACK命令(i)使用“開始交易”,“提交”,“回滾”,“保存點”和“回滾”命令。

(ii)致電 SQLEndTran() 提交或回滾。”
獲取結果集整型 sqlite3_step(sqlite3_stmt *)SQLFetch() 或者 SQLFetchScroll() 從結果集中獲取下一組行。要分塊檢索BLOB數據,請調用 SQLGetData().兩個DB都可以返回next-ROW或錯誤代碼(詳細信息如下)
連續訪問一列sqlite3_column 功能族(i)訪問檢索到使用設置的應用程序變量中的列值 SQLBindCol() 在獲取之前。

(ii)致電 SQLGetData() 在所需的列上。
SQLite使用基於列類型的函數;雙倍的 sqlite3_column_double(sqlite3_stmt *,int iCol)或int sqlite3_column_int(..)或int sqlite3_column_bytes(..)
結束語sqlite3_finalize(sqlite3_stmt * pStmt)銷毀準備好的語句並釋放其資源稱呼 SQLFreeHandle() 在語句句柄上釋放其所有資源。
關閉數據庫連接/句柄整型 sqlite3_close(sqlite3 *)和int sqlite3_close_v2(sqlite3 *)SQLFreeHandle() 釋放連接和環境句柄。這將釋放與該連接關聯的所有數據庫句柄。在SQLite中更好用 sqlite3_close_v2 因為它旨在與垃圾回收的宿主語言一起使用,並且析構函數的調用順序是任意的。
配置sqlite3_config() 接口用於對SQLite進行全局配置更改,以便根據應用程序的特定需求調整SQLite。使用配置腳本來設置環境變量。
加密整型 sqlite3_key(sqlite3 * db,const void * pKey,int nKey);

整型 sqlite3_rekey(sqlite * db,
const void * pKey,int nKey / *新密鑰* /
);
稱呼 rdm_tfsAllocEncrypt(
const char *密碼,
RDM_ENCRYPT * enc
)來創建一個encyprtion對象。

將加密對像傳遞給 SQLSetConnectAttr() 使用SQL_ATTR_RDM_ENCRYPT屬性。
SQLite使用付費的SQLite加密擴展(SEE)。

Raima使用AES加密密碼,並支持多種密鑰大小(128、192和256位)
隔離技術支持 “可串行隔離” ,但是在預寫WAL模式下,它提供了 “快照隔離”.技術支持 “可串行隔離”
職能SQLite語法/邏輯Raima語法/邏輯筆記
初始化int sqlite3_config(int,...) -用於對SQLite進行全局配置更改,以便根據應用程序的特定需求調整SQLite。SQLSetConnectAttr() 並使用我們的驅動程序定義的屬性來設置基於連接的配置選項。SQLite配置選項列表

Raima選項列表
打開數據庫連接sqlite3_open(“ test.db”,&db);SQLAllocHandle(), 其次是 SQLConnect()。建立連接後,發出“ USE ”命令使用 SQLExecute() 或者 SQLExecDirect().SQLite允許通過ATTACH DATABASE語句通過單個連接連接多個數據庫文件
內存數據庫使用“:memory:”選項;
sqlite3_open(“:memory:”,&db);
通過調用將SQL_ATTR_RDM_STORAGE_MEDIA連接屬性設置為“ INMEMORY_KEEP” SQLSetConnectAttr().SQLite不會將內存數據庫保存到磁盤!
Raima使您可以選擇保存到磁盤。
執行SQL(i)首先準備聲明
int sqlite3_prepare(
sqlite3 * db,/ *數據庫句柄* /
const char * zSql,/ * SQL語句,UTF-8編碼* /
int nByte,/ * zSql的最大長度,以字節為單位。 * /
sqlite3_stmt ** ppStmt,/ * OUT:語句句柄* /
const char ** pzTail / * OUT:指向zSql未使用部分的指針* /
);

(ii) 然後執行 使用
int sqlite3_step(sqlite3_stmt *)
(i)執行 SQLExecDirect(SQLHSTMT StatementHandle,SQLCHAR * StatementText,SQLINTEGER TextLength)。

(ii)準備 SQL準備(SQLHSTMT StatementHandle,SQLCHAR * StatementText,SQLINTEGER TextLength),然後使用 SQL執行(SQLHSTMT StatementHandle)。
根據編碼,SQLite可能會使用 sqlite3_prepare16() 用於UTF-16編碼和int sqlite3_prepare16_v3()
綁定參數sqlite3_bind_ *家庭 使用的功能;例如
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
);
稱呼 SQLParamData()SQLPutData() 處理在insert和update語句中指定的執行數據的Blob參數。
Raima的用途 SQLBindCol() 將應用程序變量綁定到列。

在SQLite中,要將使用準備好的語句重置為初始狀態,請使用-sqlite3_reset(sqlite3_stmt * pStmt)
交易次數使用BEGIN-TRANSACTION,DEFERRED / IMMEDIATE / EXCLUSIVE,END-TRANSACTION或COMMIT,SAVEPOINT和ROLLBACK命令(i)使用“開始交易”,“提交”,“回滾”,“保存點”和“回滾”命令。

(ii)致電 SQLEndTran() 提交或回滾。”
獲取結果集整型 sqlite3_step(sqlite3_stmt *)SQLFetch() 或者 SQLFetchScroll() 從結果集中獲取下一組行。要分塊檢索BLOB數據,請調用 SQLGetData().兩個DB都可以返回next-ROW或錯誤代碼(詳細信息如下)
連續訪問一列sqlite3_column 功能族(i)訪問檢索到使用設置的應用程序變量中的列值 SQLBindCol() 在獲取之前。

(ii)致電 SQLGetData() 在所需的列上。
SQLite使用基於列類型的函數;雙倍的 sqlite3_column_double(sqlite3_stmt *,int iCol)或int sqlite3_column_int(..)或int sqlite3_column_bytes(..)
結束語sqlite3_finalize(sqlite3_stmt * pStmt)銷毀準備好的語句並釋放其資源稱呼 SQLFreeHandle() 在語句句柄上釋放其所有資源。
關閉數據庫連接/句柄整型 sqlite3_close(sqlite3 *)和int sqlite3_close_v2(sqlite3 *)SQLFreeHandle() 釋放連接和環境句柄。這將釋放與該連接關聯的所有數據庫句柄。在SQLite中更好用 sqlite3_close_v2 因為它旨在與垃圾回收的宿主語言一起使用,並且析構函數的調用順序是任意的。
配置sqlite3_config() 接口用於對SQLite進行全局配置更改,以便根據應用程序的特定需求調整SQLite。使用配置腳本來設置環境變量。
加密整型 sqlite3_key(sqlite3 * db,const void * pKey,int nKey);

整型 sqlite3_rekey(sqlite * db,
const void * pKey,int nKey / *新密鑰* /
);
稱呼 rdm_tfsAllocEncrypt(
const char *密碼,
RDM_ENCRYPT * enc
)來創建一個encyprtion對象。

將加密對像傳遞給 SQLSetConnectAttr() 使用SQL_ATTR_RDM_ENCRYPT屬性。
SQLite使用付費的SQLite加密擴展(SEE)。

Raima使用AES加密密碼,並支持多種密鑰大小(128、192和256位)
隔離技術支持 “可串行隔離” ,但是在預寫WAL模式下,它提供了 “快照隔離”.技術支持 “可串行隔離”

RDM具有靈活的架構和高性能