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

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

集算器助力ireport

在使用 Jasper 報(bào)表工具制作報(bào)表時(shí),常常會(huì)遇到數(shù)據(jù)來(lái)自多個(gè)數(shù)據(jù)源的情況,通常的做法是使用主子報(bào)表或者使用javabean作為數(shù)據(jù)源。使用主子報(bào)表通常會(huì)增加報(bào)表設(shè)計(jì)的復(fù)雜度,而使用javabean做數(shù)據(jù)源,則需要一個(gè)javabean類(lèi)來(lái)支持,并且為了在設(shè)計(jì)報(bào)表時(shí)能夠看到數(shù)據(jù),還要為ireport提供一個(gè)靜態(tài)方法,該方法用于返回上面定義javabean的一個(gè)結(jié)果集。

創(chuàng)新互聯(lián)建站專(zhuān)注于水城企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城網(wǎng)站建設(shè)。水城網(wǎng)站建設(shè)公司,為水城等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

顯然,上面這兩種辦法都不太方便,本文將提供一種更加簡(jiǎn)便的方法,那就是通過(guò)集算器來(lái)解決ireport中的多數(shù)據(jù)源問(wèn)題,并進(jìn)一步提高ireport的性能。我們將以JasperReport5.6.0 開(kāi)發(fā)環(huán)境為例進(jìn)行介紹。

ireport 中如何使用多數(shù)據(jù)源

報(bào)表項(xiàng)目中,常常會(huì)出現(xiàn)報(bào)表源數(shù)據(jù)來(lái)自不同數(shù)據(jù)庫(kù)的情況,例如同一應(yīng)用系統(tǒng)的數(shù)據(jù)庫(kù)負(fù)載太大,不得已分成多個(gè)數(shù)據(jù)庫(kù),就像是最常見(jiàn)的銷(xiāo)售系統(tǒng)數(shù)據(jù)分成當(dāng)前庫(kù)和歷史庫(kù),一部分?jǐn)?shù)據(jù)存于數(shù)據(jù)庫(kù)一部分?jǐn)?shù)據(jù)存于文件等。

在多數(shù)據(jù)源的數(shù)據(jù)庫(kù)類(lèi)型方面,報(bào)表工具可能連接同樣類(lèi)型的數(shù)據(jù)庫(kù),比如都是MySQL或者 oracle;也可能是不同的類(lèi)型,如txt、csv或者Excel等。

我們的例子中,報(bào)表數(shù)據(jù)一部分來(lái)自mysql數(shù)據(jù)庫(kù),一部分來(lái)自文本文件。

其中,mysql數(shù)據(jù)庫(kù)的employee表存儲(chǔ)EID為1-100000的數(shù)據(jù),內(nèi)容如下:

集算器助力 ireport

而data.txt文件中存儲(chǔ)EID為100001-101000的數(shù)據(jù),內(nèi)容如下:

集算器助力 ireport

?

我們的任務(wù)是在ireport中制作一張報(bào)表,查看employee表和emp.txt文件合并后的所有數(shù)據(jù)。這一需求通過(guò)集算器協(xié)助 ireport可以輕松實(shí)現(xiàn)。集算器使用我們稱(chēng)之為結(jié)構(gòu)化處理語(yǔ)言(Structured Process Language,簡(jiǎn)稱(chēng)SPL),具體的SPL代碼如下:


A
1=connect("mysql")
2=A1.query@x("select * from employee")
3=file("F:\\files\\emp.txt").import@t()
4=[A2,A3].conj()
5return A4

?

A1:創(chuàng)建數(shù)據(jù)源連接,連接mysql數(shù)據(jù)源。

A2:在mysql數(shù)據(jù)源中查詢(xún)employee表中的數(shù)據(jù),并返回查詢(xún)結(jié)果。

集算器助力 ireport

A3:讀取文件emp.txt的內(nèi)容。

集算器助力 ireport

A4:合并A2和A3數(shù)據(jù)。

集算器助力 ireport

A4:將A4合并后的結(jié)果返回給報(bào)表。

?

為了在報(bào)表中呈現(xiàn)計(jì)算結(jié)果,我們需要將以上 SPL 代碼存為文件 employee.dfx,然后就可以利用集算器對(duì)外提供的 JDBC 接口調(diào)用這個(gè)腳本了。

在報(bào)表工具中通過(guò)建立 JDBC 數(shù)據(jù)源引入集算器腳本的方法和調(diào)用存儲(chǔ)過(guò)程一樣,在 Jasper 的 SQL 設(shè)計(jì)器中可以用call employee()來(lái)調(diào)用。具體步驟在《JasperReport 調(diào)用 SPL 腳本》一文中有詳細(xì)的描述。

然后,我們可以在ireport 中設(shè)計(jì)一個(gè)最簡(jiǎn)單的報(bào)表employee.jrxml,模板如下:

集算器助力 ireport

預(yù)覽后可以直接看到報(bào)表結(jié)果了:

?

集算器助力 ireport

顯然,這個(gè)過(guò)程相比傳統(tǒng)的主子報(bào)表或者javabean方法要簡(jiǎn)單不少,更重要的是,計(jì)算邏輯非常清晰,集成方式也幾乎沒(méi)有任何學(xué)習(xí)成本。

性能優(yōu)化

在解決了基本的功能需求后,我們還可以進(jìn)一步將焦點(diǎn)關(guān)注到性能方面。報(bào)表項(xiàng)目中,常常需要將多個(gè)表連接查詢(xún),在這些被連接的表中,可能會(huì)包含海量的數(shù)據(jù)。例如:將雇員表和訂單表通過(guò)共有字段員工編號(hào)連接起來(lái),以便查看某些訂單的銷(xiāo)售人員的信息。顯然,訂單表會(huì)隨著時(shí)間的推移不斷增長(zhǎng),最終帶來(lái)嚴(yán)重的系統(tǒng)負(fù)擔(dān)。

下面例子中的報(bào)表數(shù)據(jù)一部分來(lái)自mysql數(shù)據(jù)庫(kù)的employee表,一部分來(lái)自mysql數(shù)據(jù)庫(kù)的sales表。

其中,employee表存儲(chǔ)EID為1-3000000的雇員數(shù)據(jù),內(nèi)容如下:

集算器助力 ireport

而訂單數(shù)據(jù)sales表則存儲(chǔ)了76萬(wàn)條數(shù)據(jù),而且持續(xù)增加。其中的數(shù)據(jù)內(nèi)容樣例如下:

?

集算器助力 ireport

為了實(shí)現(xiàn)連接查詢(xún),我們?cè)趇report 中設(shè)計(jì)一個(gè)最簡(jiǎn)單的報(bào)表mysql_join.jrxml,模板如下:

集算器助力 ireport

首先我們看一下傳統(tǒng)做法的表現(xiàn)。我們需要查詢(xún)?cè)缬?015-04-01,由EID小于1000001的雇員產(chǎn)生的銷(xiāo)售數(shù)據(jù),SQL 語(yǔ)句如下:

select?sales.OID,sales.Date,sales.EID,sales.Amount,employee.Name?from?sales?join?employee?on?sales.EID=employee.EID?where?sales.Date<'2015-04-01'and?employee.EID<1000001select?sales.OID,sales.Date,sales.EID,sales.Amount,employee.Name?from?sales?join?employee?on?sales.EID=employee.EID?where?sales.Date<'2015-04-01'and?employee.EID<1000001

點(diǎn)擊預(yù)覽,在我們的測(cè)試環(huán)境下,101s后展現(xiàn)計(jì)算結(jié)果:

集算器助力 ireport

接下來(lái),我們看看用集算器jdbc的運(yùn)行效果。將上邊的報(bào)表另存為esproc_join.jrxml。

然后編寫(xiě)如下的SPL代碼:


A
1=connect("mysql")
2=A1.cursor("select * from sales where ? Date<'2015-04-01'")
3=A1.query("select EID,Name from employee ? where ?EID<1000001").keys(EID)
4=A2.join@i(EID,A3:EID,Name)
5return A4.fetch()

?

A1:創(chuàng)建數(shù)據(jù)源連接,連接mysql數(shù)據(jù)源。

A2:查詢(xún)sales表中Date早于2015-04-01的數(shù)據(jù),將結(jié)果返回成游標(biāo)。

A3:查詢(xún)employee表中EID小于1000001的EID列和Name列的數(shù)據(jù)。

集算器助力 ireport

A4:游標(biāo)A2與序表A3外鍵式連接。

A5:將游標(biāo)的結(jié)果返回給報(bào)表。

?

接下來(lái)和前一個(gè)例子一樣,將以上 SPL 代碼存為文件esproc_join.dfx,并在數(shù)據(jù)源中定義SQL:

call?esproc_join()call?esproc_join()

現(xiàn)在,我們點(diǎn)擊預(yù)覽,在同樣的測(cè)試環(huán)境下,14s后就得到了完全相同的計(jì)算結(jié)果。

可見(jiàn),使用集算器在簡(jiǎn)化了ireport訪(fǎng)問(wèn)多數(shù)據(jù)源的同時(shí),還可以大大提高ireport的性能。本文中的例子只是集算器中一些簡(jiǎn)單的應(yīng)用。事實(shí)上,基于集算器的靈活性,使用集算器提高性能的辦法有很多,包括并行取數(shù)、可控緩存、控制SQL執(zhí)行路徑、減少隱藏格、引入數(shù)據(jù)計(jì)算層等等。更多更高級(jí)的使用快來(lái)乾學(xué)院看看吧!


名稱(chēng)欄目:集算器助力ireport
網(wǎng)站URL:http://weahome.cn/article/jdcsgc.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部