Raima Database Manager如何擊敗SQLite
SQLite面臨的4個主要挑戰以及Raima Database Manager如何避免這些挑戰
挑戰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,以及預打包的項目文件和開發環境集成。
性能比較示例-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語法/邏輯 | Raima語法/邏輯 | 筆記 |
---|---|---|---|
初始化 | int sqlite3_config(int,...) -用於對SQLite進行全局配置更改,以便根據應用程序的特定需求調整SQLite。 | SQLSetConnectAttr() 並使用我們的驅動程序定義的屬性來設置基於連接的配置選項。 | SQLite配置選項列表 Raima選項列表 |
打開數據庫連接 | sqlite3_open(“ test.db”,&db); | SQLAllocHandle(), 其次是 SQLConnect()。建立連接後,發出“ USE | 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 | 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模式下,它提供了 “快照隔離”. | 技術支持 “可串行隔離” |