◆邵 嵐 許石昌 呂 健
C++與Java的數據庫操作比較
◆邵 嵐 許石昌 呂 健
(CLO 北京 100000)
數據庫的操作速度是相關產品性能的主要衡量指標,不同語言對數據庫的操作速度也不盡相同。本文通過對C++和Java兩種語言對數據庫的不同操作,編寫測試用例,執行DQL(數據庫查詢語言)和DML(數據庫操縱語言)語句訪問ORACLE數據庫,通過對比執行效率來分析兩種語言的優劣,進而指導我們對編程語言的選擇。
性能測試;編程語言;SQL語句
隨著計算機技術不斷發展,各種編程語言也隨著發展,使當今的大多數程序開發人員可以擺脫枯燥無味的計算機指令或匯編語言開發軟件,而是利用一系列高效的、面向對象的語言去開發軟件,從而達到事半功倍的效果,C++和Java是如今使用最多、最為流行的兩種編程語言,本文使用兩種語言進行程序開發,編寫測試用例,執行DQL(數據庫查詢語言)和DML(數據庫操縱語言)語句訪問ORACLE數據庫,通過對比執行效率來分析兩種語言的優劣,進而指導我們對于編程語言的選擇。
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程 。
Java具有簡單性、面向對象、分布式、健壯性、安全性、平臺獨立與可移植性、多線程、動態性等特點 。
C++ 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的編程語言,支持過程化編程、面向對象編程和泛型編程。C++ 被認為是一種中級語言,它綜合了高級語言和低級語言的特點。
C++ 完全支持面向對象的程序設計,包括面向對象開發的四大特性:封裝,抽象,繼續,多態。標準的 C++ 由三個重要部分組成:核心語言,提供了所有構件塊,包括變量、數據類型和常量等;C++ 標準庫,提供了大量的函數,用于操作文件、字符串等;標準模板庫(STL),提供了大量的方法,用于操作數據結構等。
(1)硬件環境
CPU型號:Intel(R) Xeon(R) CPU E7-4820 v2 @ 2.00GHz
服務器配置:4*8core
內存大小:256G
(2)軟件環境
數據庫軟件:Oracle 11.2.0.4 版本集群數據庫軟件
操作系統:Red Hat Enterprise Linux Server release 6.5 (Santiago)
Java:ojdbc6.jar(Oracle的官方驅動)、JDK版本1.8.0_181
C++: glibc版本2.12-1.132.el6.x86_64
(3)測試內容
本文使用Java和C++語言進行程序開發,編寫測試用例,執行DQL(數據庫查詢語言)和DML(數據庫操縱語言)語句訪問ORACLE數據庫,通過對比執行效率來分析兩種語言的優劣,進而指導我們對于編程語言的選擇。
我們的測試就是使用Oracle11g的數據庫連接池Connection Pool而進行的,具體操作是在Linux操作系統層面通過主線程創建多個子線程,并且由各個子線程分別連接數據庫,然后對數據庫進行插入、刪除、更新和查詢等操作,操作完成后關閉連接。線程數為10個,數據庫表在每個線程上的SerialID不同。
以下所有測試過程,C++程序與Java程序都執行相同的數據庫操作。
測試說明:
(1)清空數據庫表。
(2)對數據庫表進行插入操作,其表的DetailID字段順序增長,其余字段固定不變。插入的條目數量分別為1萬條,10萬條,50萬條和100萬條。
(3)每插入一次數據,進行一次Commit操作。
測試結果如表1、圖1所示。

表1 Insert測試結果 單位:毫秒

圖1 Insert測試結果
結論:
(1)C++語言對于數據庫Insert操作效率整體略優于Java語言。
(2)隨著Insert的數據量增長,兩種語言程序的執行時間也基本呈線性增長。
測試說明:
(1)數據庫表中的記錄為1000000條。
(2)對數據庫表進行查詢操作,其表的SerialID字段和DetailID字段做為查詢條件,且為主鍵。查詢的數量分別為1000條,1萬條,10萬條和50萬條。查詢結果為部分成功。
測試結果如表2、圖2所示。

表2 Select測試結果 單位:毫秒

圖2 Select測試結果
結論:
(1)C++語言對于數據庫Select操作在查詢數據較小時,優于Java語言,在大數據量訪問時,兩種語言性能相當。
(2)隨著Select的數據量線性增長,Java語言時間增長優于線性增長。
測試說明:
(1)數據庫表中的記錄為1000000條。
(2)對數據庫表進行更新操作,表的TotalMoney字段為傳入參數,SerialID字段和DetailID字段為更新條件,且為主鍵。更新的條目數量分別為1000條,1萬條,10萬條和50萬條。
(3)每更新一次數據,進行一次Commit操作。
測試結果如表3、圖3所示。

表3 Update測試結果 單位:毫秒

圖3 Update測試結果
結論:
(1)對于數據庫Update操作,C++語言性能與Java語言相當。
(2)隨著Update的數據量增長,兩種語言程序的執行時間也基本呈線性增長。
測試說明:
(1)數據庫表中的記錄為1000000條。
(2)對數據庫表進行刪除操作,表的SerialID字段和DetailID字段為刪除條件,且為主鍵。刪除的條目數量分別為1000條,1萬條,5萬條和10萬條。
(3)每插入一次數據,進行一次Commit操作。
測試結果如表4、圖4所示。

表4 Delete測試結果 單位:毫秒

圖4 Delete測試結果
結論:
(1)對于數據庫Delete操作,C++語言性能優于Java語言。
(2)隨著Delete的數據量增長,兩種語言程序的執行時間也基本呈線性增長。
測試說明:
(1)清空數據庫表。
(2)對數據庫表進行查詢、插入、更新操作。其中查詢和更新對應一個相同的表,而插入對應另一個不同的表。測試的條目數量分別為1000條,10000條,50000條和100000條。
(3)每進行一次查詢、插入、更新操作,執行一次Commit操作。
測試結果如表5、圖5所示。

表5 全業務測試結果 單位:毫秒

圖5 全業務測試結果
結論:
(1)對于數據庫全業務操作,C++語言性能優于Java語言。
(2)隨著操作的數據量增長,兩種語言程序的執行時間也基本呈線性增長。
在本文環境下,我們分別對數據庫的不同操作進行了測試,包括插入操作,查詢操作,更新操作,刪除操作和全業務操作(查詢,插入和更新,其中查詢和更新對應同一個表,插入對應另一個表);其中插入、更新、刪除和全業務測試使用多線程技術作了循環Commit(每個數據庫條目操作提交一次)測試,
從測試數據中,可以看出C++語言在對相對較少的數據操作時,通常在10000條數據以內,都具有明顯效率優勢。隨著數據庫操作數量的增長,兩種語言的效率逐漸趨于相同,在數據庫操作數量很大時,Java對數據庫的操作效率甚至會超越C++語言。但是在全業務操作上,C++的效率幾乎是Java的兩倍。
性能:通過不同操作的多種組合測試,我們發現對于單個批量操作的循環提交,Java明顯不如C++,在全業務的批量操作循環提交中,C++更是達到了Java 的兩倍。
易用性:Java使用的人最多,且網上文檔多,操作方便,C++用起來比較麻煩點。
前途:目前的實際業務操作中,全業務操作和循環提交是更為經常使用的,因此C++在Oracle數據庫的實際使用效率上更勝一籌。
注:當使用不同的硬件環境和軟件環境進行測試時,測試結果會有所不同。