亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

集算器助力 ireport

發布時間:2020-06-09 11:21:26 來源:網絡 閱讀:178 作者:raqsoft 欄目:大數據

在使用 Jasper 報表工具制作報表時,常常會遇到數據來自多個數據源的情況,通常的做法是使用主子報表或者使用javabean作為數據源。使用主子報表通常會增加報表設計的復雜度,而使用javabean做數據源,則需要一個javabean類來支持,并且為了在設計報表時能夠看到數據,還要為ireport提供一個靜態方法,該方法用于返回上面定義javabean的一個結果集。

顯然,上面這兩種辦法都不太方便,本文將提供一種更加簡便的方法,那就是通過集算器來解決ireport中的多數據源問題,并進一步提高ireport的性能。我們將以JasperReport5.6.0 開發環境為例進行介紹。

ireport 中如何使用多數據源

報表項目中,常常會出現報表源數據來自不同數據庫的情況,例如同一應用系統的數據庫負載太大,不得已分成多個數據庫,就像是最常見的銷售系統數據分成當前庫和歷史庫,一部分數據存于數據庫一部分數據存于文件等。

在多數據源的數據庫類型方面,報表工具可能連接同樣類型的數據庫,比如都是mysql或者 oracle;也可能是不同的類型,如txt、csv或者Excel等。

我們的例子中,報表數據一部分來自mysql數據庫,一部分來自文本文件。

其中,mysql數據庫的employee表存儲EID為1-100000的數據,內容如下:

集算器助力 ireport

而data.txt文件中存儲EID為100001-101000的數據,內容如下:

集算器助力 ireport

?

我們的任務是在ireport中制作一張報表,查看employee表和emp.txt文件合并后的所有數據。這一需求通過集算器協助 ireport可以輕松實現。集算器使用我們稱之為結構化處理語言(Structured Process Language,簡稱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:創建數據源連接,連接mysql數據源。

A2:在mysql數據源中查詢employee表中的數據,并返回查詢結果。

集算器助力 ireport

A3:讀取文件emp.txt的內容。

集算器助力 ireport

A4:合并A2和A3數據。

集算器助力 ireport

A4:將A4合并后的結果返回給報表。

?

為了在報表中呈現計算結果,我們需要將以上 SPL 代碼存為文件 employee.dfx,然后就可以利用集算器對外提供的 JDBC 接口調用這個腳本了。

在報表工具中通過建立 JDBC 數據源引入集算器腳本的方法和調用存儲過程一樣,在 Jasper 的 SQL 設計器中可以用call employee()來調用。具體步驟在《JasperReport 調用 SPL 腳本》一文中有詳細的描述。

然后,我們可以在ireport 中設計一個最簡單的報表employee.jrxml,模板如下:

集算器助力 ireport

預覽后可以直接看到報表結果了:

?

集算器助力 ireport

顯然,這個過程相比傳統的主子報表或者javabean方法要簡單不少,更重要的是,計算邏輯非常清晰,集成方式也幾乎沒有任何學習成本。

性能優化

在解決了基本的功能需求后,我們還可以進一步將焦點關注到性能方面。報表項目中,常常需要將多個表連接查詢,在這些被連接的表中,可能會包含海量的數據。例如:將雇員表和訂單表通過共有字段員工編號連接起來,以便查看某些訂單的銷售人員的信息。顯然,訂單表會隨著時間的推移不斷增長,最終帶來嚴重的系統負擔。

下面例子中的報表數據一部分來自mysql數據庫的employee表,一部分來自mysql數據庫的sales表。

其中,employee表存儲EID為1-3000000的雇員數據,內容如下:

集算器助力 ireport

而訂單數據sales表則存儲了76萬條數據,而且持續增加。其中的數據內容樣例如下:

?

集算器助力 ireport

為了實現連接查詢,我們在ireport 中設計一個最簡單的報表mysql_join.jrxml,模板如下:

集算器助力 ireport

首先我們看一下傳統做法的表現。我們需要查詢早于2015-04-01,由EID小于1000001的雇員產生的銷售數據,SQL 語句如下:

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

點擊預覽,在我們的測試環境下,101s后展現計算結果:

集算器助力 ireport

接下來,我們看看用集算器jdbc的運行效果。將上邊的報表另存為esproc_join.jrxml。

然后編寫如下的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:創建數據源連接,連接mysql數據源。

A2:查詢sales表中Date早于2015-04-01的數據,將結果返回成游標。

A3:查詢employee表中EID小于1000001的EID列和Name列的數據。

集算器助力 ireport

A4:游標A2與序表A3外鍵式連接。

A5:將游標的結果返回給報表。

?

接下來和前一個例子一樣,將以上 SPL 代碼存為文件esproc_join.dfx,并在數據源中定義SQL:

call?esproc_join()call?esproc_join()

現在,我們點擊預覽,在同樣的測試環境下,14s后就得到了完全相同的計算結果。

可見,使用集算器在簡化了ireport訪問多數據源的同時,還可以大大提高ireport的性能。本文中的例子只是集算器中一些簡單的應用。事實上,基于集算器的靈活性,使用集算器提高性能的辦法有很多,包括并行取數、可控緩存、控制SQL執行路徑、減少隱藏格、引入數據計算層等等。更多更高級的使用快來乾學院看看吧!


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太仆寺旗| 永年县| 瑞丽市| 军事| 洱源县| 镇远县| 龙泉市| 宜兰市| 宾阳县| 东乌珠穆沁旗| 太谷县| 百色市| 汝州市| 武邑县| 邻水| 库尔勒市| 内黄县| 慈利县| 聂拉木县| 乌兰县| 旅游| 姜堰市| 德清县| 南康市| 宜昌市| 云和县| 建湖县| 霍邱县| 台北县| 景洪市| 峡江县| 涞水县| 紫金县| 东丰县| 白水县| 西峡县| 米脂县| 乌拉特前旗| 秦皇岛市| 翁源县| 米泉市|