真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

加速JDBC的快捷方法

JAVA 應(yīng)用必須通過 JDBC 從數(shù)據(jù)庫中取數(shù),有時(shí)候我們會發(fā)現(xiàn),數(shù)據(jù)庫的負(fù)擔(dān)一點(diǎn)也不重而且 SQL 很簡單,但取數(shù)的速度仍然很慢。仔細(xì)測試會發(fā)現(xiàn),性能瓶頸主要在 JDBC 上,比如 MySQL 的 JDBC 性能就非常差,Oracle 也不好。但是,JDBC 是數(shù)據(jù)庫廠商提供的包,我們在外部沒辦法提高性能。

創(chuàng)新互聯(lián)企業(yè)建站,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對于網(wǎng)站建設(shè)、網(wǎng)站制作中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動的思維在網(wǎng)頁中充分展現(xiàn),通過對客戶行業(yè)精準(zhǔn)市場調(diào)研,為客戶提供的解決方案。

可以想到的辦法是利用多 CPU 手段采用并行方案來提速,但 Java 的并行程序非常難寫,要考慮資源共享沖突等麻煩事務(wù)。

下面介紹使用集算器的并行技術(shù)來提升數(shù)據(jù)庫 JDBC 取數(shù)性能,可以避免 JAVA 硬編碼的復(fù)雜性,還能夠方便實(shí)現(xiàn)多線程結(jié)果集的合并。適用于:

  1. 源數(shù)據(jù)規(guī)模較大的查詢報(bào)表

  2. 多數(shù)據(jù)集報(bào)表

  3. ETL 數(shù)據(jù)抽取

集算器并行配置

通過集算器進(jìn)行并行取數(shù)前需要配置集算器的并行屬性。IDE 中通過菜單“工具 - 選項(xiàng)”設(shè)置 IDE 支持的最大并行數(shù)量,一般建議最大并行數(shù)不要超過 CPU 核數(shù)。
加速JDBC的快捷方法
集算器服務(wù)端則需要修改 raqsoftConfig.xml 配置:
加速JDBC的快捷方法

單表并行取數(shù)

有時(shí)我們查詢的某個(gè)表數(shù)據(jù)量較大、時(shí)間較長,這時(shí)就可以通過集算器針對單表并行取數(shù)提升性能。這里所謂的單表是指通過條件并行讀取一份(單表)數(shù)據(jù)。

全內(nèi)存

假設(shè)內(nèi)存可以容納全部要讀取的數(shù)據(jù),并行取數(shù)后再進(jìn)行下一步運(yùn)算(全內(nèi)存的計(jì)算速度最快)。

舉例

訂單(Orders)有訂單 ID,訂購日期,訂單金額等字段,其中訂單 ID 是遞增的整數(shù)邏輯主鍵。

加速JDBC的快捷方法

【計(jì)算目標(biāo)】并行讀取某時(shí)間段內(nèi)訂單數(shù)

面向單表(單條 SQL)并行取數(shù)需要通過參數(shù)將源數(shù)據(jù)拆分多段,建立多個(gè)數(shù)據(jù)庫連接并行查詢。往往需要將數(shù)據(jù)盡可能平均拆分以避免查詢時(shí)間不均導(dǎo)致任務(wù)等待,同時(shí)分段參數(shù)盡可能建立在索引字段上以保證分段效率。

集算器實(shí)現(xiàn)

集算器參數(shù)

根據(jù)查詢時(shí)間段建立腳本參數(shù),查詢起止日期

加速JDBC的快捷方法

集算器實(shí)現(xiàn)

分段策略(一)基于索引字段分段

基于單表(單 SQL)并行取數(shù)前需要進(jìn)行數(shù)據(jù)分段,盡量保證每個(gè)分段的數(shù)據(jù)平均。而分段參數(shù)盡量基于建立索引的字段(如訂單編號)。之所以要使用索引字段來分段,是因?yàn)槭褂盟饕⒉粫娴乇闅v整個(gè)表,而是直接定位,當(dāng)數(shù)據(jù)量較大時(shí)優(yōu)勢明顯。

集算器腳本

編寫并行取數(shù)腳本,這里按照建立索引的訂單編號進(jìn)行分段:


ABC
1=connect(“db”)

2=A1.query(“select min( 訂單 ID) 最小 ID,max(訂單 ID) 最大 ID from 訂單 where 訂購日期 >=? and 訂購日期 <=?”,begin,end)=b=A2. 最小 ID=e=A2. 最大 ID
3=p=4/ 并行數(shù)
4=p.(b+(e-b)*~\p)/ 分段參數(shù)終值
5=bA4.to(,p-1).(~+1)/ 分段參數(shù)初值
6fork A5,A4

7
=connect(“db”)
8
=B7.query@x(“select * from 訂單 where 訂單 ID>=? and 訂單 ID<=? and 訂購日期 >=? and 訂購日期 <=?”,A6(1),A6(2),begin,end)
9=A6.conj()/ 合并查詢結(jié)果

腳本解析:

1、A2 根據(jù)查詢起止日期獲得最大訂單編號和最小訂單編號,用于后面分段

2、B2-C2 將最小訂單號和最大訂單號分別賦值給變量 b 和 e

加速JDBC的快捷方法

3、A3 設(shè)置并行數(shù),使用并行取數(shù)前應(yīng)檢查集算器的并行數(shù)配置以及授權(quán)中對并行數(shù)量的許可

4、A4-A5 根據(jù)起止訂單編號和并行數(shù)計(jì)算每個(gè)并行任務(wù)的起止分段參數(shù)(序列)

加速JDBC的快捷方法

5、通過 fork 啟動多個(gè)(4 個(gè))線程,參數(shù)為分段起止參數(shù)序列,這里可以看到 fork 啟動的線程數(shù)與參數(shù)序列成員數(shù)相同。在集算器中,經(jīng)常將序表、序列作為參數(shù)值參與運(yùn)算,非常方便

6、B7 為每個(gè)線程(子任務(wù))建立數(shù)據(jù)庫連接,需要注意連接必須在 fork 子句中建立,以便為多線程分別使用,若共用一個(gè)連接無法起到加速取數(shù)的效果,數(shù)據(jù)庫會自動把同一連接上的多個(gè)請求改為串行執(zhí)行。因此只有當(dāng)數(shù)據(jù)庫負(fù)擔(dān)不重,有足夠多連接可用時(shí)才可以使用并行取數(shù)提升性能

7、B8 分別查詢每個(gè)分段數(shù)據(jù),查詢結(jié)果返回到 A6 格。這里 fork 子句直接返回查詢結(jié)果(子句最后一行),如果想返回其中某個(gè)或某幾個(gè)計(jì)算值可以顯示使用 return 關(guān)鍵字返回子線程計(jì)算結(jié)果

8、返回結(jié)果的 A6 格結(jié)果,4 個(gè)線程返回 4 個(gè)結(jié)果集

加速JDBC的快捷方法

2、A9 合并多路游標(biāo),接下來就可以當(dāng)做一個(gè)游標(biāo)繼續(xù)使用

3、A10 基于游標(biāo),將查詢數(shù)據(jù)分批寫入文件中。因?yàn)楦鱾€(gè)線程的運(yùn)行速度無法保證規(guī)律性,所以基于多線程導(dǎo)出數(shù)據(jù)時(shí)次序不可控,對數(shù)據(jù)順序有要求時(shí)不能使用這個(gè)方法。

基于外存游標(biāo)并行查詢與全內(nèi)存方式非常類似,當(dāng)內(nèi)存資源較緊張時(shí)可以通過外存計(jì)算的方式減少內(nèi)存占用。

多表并行取數(shù)

除了通過條件針對單條 SQL(單表)進(jìn)行并行取數(shù)外,在一些多 SQL 查詢場景(如報(bào)表多數(shù)據(jù)集)下仍然可以通過并行同時(shí)執(zhí)行多條語句進(jìn)行取數(shù)。

舉例

有多個(gè)查詢 SQL 基于多個(gè)表查詢數(shù)據(jù),需要提升查詢性能。

【計(jì)算目標(biāo)】并行讀取 5 個(gè)表數(shù)據(jù),并完成關(guān)聯(lián)

這里我們使用 5 條非常簡單(基于單表)的查詢 SQL,實(shí)際業(yè)務(wù)中多條SQL 可以任意復(fù)雜。

集算器實(shí)現(xiàn)


ABC
1=connect(“db”)

2=”select * from 訂單 where  訂購日期 >=date(‘”/begin/”‘) and 訂購日期 <=date(‘”/end/”‘)”

3select 訂單 ID, 產(chǎn)品 ID, 單價(jià), 數(shù)量 from 訂單明細(xì)

4select 客戶 ID, 公司名稱 from 客戶

5select 雇員 ID, 姓名 from 雇員

6select 產(chǎn)品 ID, 產(chǎn)品名稱 from 產(chǎn)品

7fork [A2:A6]

8
=connect(“db”)
9
=B8.query@x(A7)
10= 訂單 =A7(1)= 明細(xì) =A7(2)
11= 客戶 =A7(3)= 雇員 =A7(4)= 產(chǎn)品 =A7(5)
12> 訂單.switch(客戶 ID, 客戶: 客戶 ID; 雇員 ID, 雇員: 雇員 ID)

13= 明細(xì).switch(訂單 ID, 訂單: 訂單 ID; 產(chǎn)品 ID, 產(chǎn)品: 產(chǎn)品 ID)

14=A13.new(訂單 ID. 客戶 ID. 公司名稱: 客戶名稱, 訂單 ID. 訂單 ID: 訂單編號, 訂單 ID. 雇員 ID. 姓名: 銷售, 產(chǎn)品 ID. 產(chǎn)品名稱: 產(chǎn)品, 單價(jià): 價(jià)格, 數(shù)量)

腳本解析:

1、A2-A6 為查詢用 SQL 語句串

2、A7 根據(jù)多條 SQL 組成序列啟動多線程(5 個(gè))

3、B9 每個(gè)線程執(zhí)行 SQL 查詢數(shù)據(jù)將結(jié)果返回到 A7 格(5 個(gè)結(jié)果集組成的序列)

4、A10-C11 通過序號分別獲取 5 個(gè)結(jié)果集

5、為了保證完整性,A12-A14 對 5 個(gè)結(jié)果集進(jìn)行關(guān)聯(lián)并通過外鍵屬性化的方式創(chuàng)建結(jié)果序表

以上是集算器并行取數(shù)的部分示例,事實(shí)上集算器還可以做更復(fù)雜的并行計(jì)算和結(jié)果歸并。集算器多線程并行的意義在于使用簡單、成本低,相對 JAVA 復(fù)雜的多線程編程集算器可以簡單到幾行腳本,相對數(shù)據(jù)庫集群方案集算器的成本更加可控,而且即使部署數(shù)據(jù)庫集群仍然可以使用集算器加速集群單個(gè)數(shù)據(jù)庫節(jié)點(diǎn)的取數(shù)速度。


文章名稱:加速JDBC的快捷方法
轉(zhuǎn)載注明:http://weahome.cn/article/jshjeh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部