www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > 技術讓夢想更偉大
[導讀]數(shù)據(jù)庫JDBC有多慢JAVA應用必須通過JDBC從數(shù)據(jù)庫中取數(shù),有時候我們會發(fā)現(xiàn),數(shù)據(jù)庫的負擔一點也不重而且SQL很簡單,但取數(shù)的速度仍然很慢。我們來實際測試一下,有個感性認識,以Oracle為例。數(shù)據(jù)來源使用TPCH生成的數(shù)據(jù),選用其中的customer表來做測試,數(shù)據(jù)記錄為1...

數(shù)據(jù)庫JDBC有多慢JAVA 應用必須通過 JDBC 從數(shù)據(jù)庫中取數(shù),有時候我們會發(fā)現(xiàn),數(shù)據(jù)庫的負擔一點也不重而且 SQL 很簡單,但取數(shù)的速度仍然很慢。我們來實際測試一下,有個感性認識,以Oracle為例。數(shù)據(jù)來源使用TPCH生成的數(shù)據(jù),選用其中的customer表來做測試,數(shù)據(jù)記錄為1500萬行,8個字段。它生成的原始文本文件名為customer.tbl,文件大小為2.3G。利用數(shù)據(jù)庫提供的數(shù)據(jù)導入工具將此文件數(shù)據(jù)導入到Oracle的數(shù)據(jù)表中。測試環(huán)境CPU:2顆Intel3014,主頻1.7G,每個CPU內核數(shù)6個。硬盤(SSD):1T  561MB/s(讀)   523MB/s(寫)   接口:SATA 6.0Gb/s內存:64G。操作系統(tǒng):Linux CentOS 7所有測試均在服務器本機上完成,沒有消耗網(wǎng)絡傳輸時間。數(shù)據(jù)庫讀數(shù)測試通過Oracle提供的JDBC接口,用SQL語句執(zhí)行數(shù)據(jù)讀取。Java寫起來麻煩,用SPL腳本執(zhí)行測試:

A B
1 =now() /記錄時間
2 =connect("oracle") /連接數(shù)據(jù)庫
3 =A2.cursor("SELECT * FROM CUSTOMER") /生成取數(shù)游標
4 for A3,10000 /循環(huán)取數(shù),每次10000條
5 =A2.close() /關閉連接
6 =interval@s(A1,now()) /計算時長
測試結果:275秒文本文件對比測試只從上面的測試結果來看,還沒有太多感性認識,我們再讀一下文本文件來對比。辦法是一樣的,從文件中讀出數(shù)據(jù),并解析出記錄,不作任何計算。編寫如下SPL腳本執(zhí)行測試:

A B
1 =now() /記錄時間
2 =file("customer.tbl") /文件對象
3 =A2.cursor(;,"|") /生成取數(shù)游標,分隔符是|
4 for A3,10000 /循環(huán)取數(shù),每次10000條
5 =interval@s(A1,now()) /計算時長
測試結果:43秒這意味著,讀取文本要比讀取Oracle快275/43=6.4倍。我們知道,文本解析是個非常麻煩的事情,但即使這樣,從文本文件讀取數(shù)據(jù)還是遠遠快于從數(shù)據(jù)庫中讀數(shù)。
利用集算器 SPL并行提速當數(shù)據(jù)只能從數(shù)據(jù)庫讀取,而且數(shù)據(jù)庫本身負擔并不重時,我們可以利用多 CPU 并行方案來提速,但寫Java 的并行程序非常麻煩,要考慮資源共享沖突等問題。使用集算器SPL的并行技術可以提升數(shù)據(jù)庫JDBC取數(shù)性能,避免 JAVA 硬編碼的復雜性,方便實現(xiàn)多線程結果集的合并。下面我們來測試一下。單表并行取數(shù)還是上面的這張customer表 ,改為并行取數(shù)后,可以看到性能提升明顯,代碼如下:

A B
1 =now() /記錄時間
2 =connect("oracle").query@ix("SELECT COUNT(*) FROM CUSTOMER")(1)
3 >n=12 /并行數(shù)
4 =n.([int(A2/n)*(~-1),int(A2/n)*~]) /按并行數(shù)分段區(qū)間
5 fork A4 =connect("oracle")
6
=B5.query@x("SELECT * FROM CUSTOMER WHERE C_CUSTKEY>? AND C_CUSTKEY<=?",A5(1),A5(2))
7 =A5.conj() /合并結果
8 =interval@s(A1,now()) /計算時長
測試結果:28秒(非并行用時275秒)并行取數(shù),就要把源數(shù)據(jù)分成相對平均的多個區(qū)間。本例中,C_CUSTKEY是從1開始的自然數(shù),因此可以先求出總記錄數(shù)(A2),再用平均分成n段(A4)。然后 A5并行計算,每個線程各自連接數(shù)據(jù)庫,再以C_CUSTKEY區(qū)間為參數(shù)執(zhí)行SQL。最后合并多線程的取數(shù)結果,作為最終結果。 實際情況中,可能需要采取其它辦法設置WHERE條件以獲得相對平均的區(qū)間。多表并行取數(shù)有時候是多個SQL取數(shù),也可以利用并行方法來提速。還是使用TPCH生成的數(shù)據(jù),數(shù)據(jù)總量減少為5G,選用其中的5張表來做測試。當采用非并行取數(shù)時,可以發(fā)現(xiàn)性能不夠理想,代碼如下:

A B
1 SELECT * FROM SUPPLIER
2 SELECT * FROM PART
3 SELECT * FROM CUSTOMER
4 SELECT * FROM PARTSUPP
5 SELECT * FROM ORDERS
6 =now() /記錄時間
7 =connect("oracle") /連接數(shù)據(jù)庫
8 =[A1:A5].(A7.query(~)) /順序執(zhí)行每條SQL
9 >A7.close() /關閉連接
10 =interval@ms(A6,now()) /計算時長
測試結果:360秒改為并行取數(shù)后,可以看到性能提升明顯,代碼如下:
11 =now() /記錄時間
12 fork [A1:A5] =connect("oracle")
13
=B12.query@x(A12)
14 =interval@ms(A11,now()) /計算時長
測試結果:167秒盡管多表并行無法保證數(shù)據(jù)均勻分布,但并行計算也能讓取數(shù)性能得到有效提升。集算器 SPL 是 Java 寫的開源軟件,提供了 JDBC 接口,很容易集成到 Java 應用中。


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉
關閉