BIRT 異構跨庫的動態關聯查詢怎麼做

xiaohuihui發表於2020-06-18

BIRT自帶的Data Sources Join以及用ETL轉化為同庫等方案都難以解決此類問題。具體可以透過如下示例討論:

交易明細資料(trade表)儲存於生產系統的資料庫DB2中,另外一部分業務資料(network表、account表)儲存於業務系統的Mysql中,它們其中的關聯關係如下圖所示:

BIRT 異構跨庫的動態關聯查詢怎麼做

所謂“動態關聯”,是指使用者在前臺介面輸入引數,報表透過引數來決定trade和哪張表做關聯,並在報表中顯示關聯後的資料,實際運算中可能還要進行資料過濾和彙總。查詢流程如下圖所示:

BIRT 異構跨庫的動態關聯查詢怎麼做

比如查詢場景一:報表根據傳入引數,能動態地將trade中的outAccount欄位和account中的accountNo欄位關聯,最後查詢結果顯示trade中的所有欄位以及account的name,gender,city等欄位。

解決此類問題的常見方案與不足,分析如下:

1、BIRT Data Sources Join的問題在於要求表名和欄位名是已知、確定的,但這類報表都是透過引數來動態關聯的,因此無法實現。

2、可以用ETL把生產庫的資料抽取到業務庫,這樣跨庫的問題就轉化為同庫了。這個方案思路簡單但實施起來細節上有很多難點。首先是實時查詢:為了實時查詢資料,需要在生產庫使用觸發器之類的功能來檢測資料的實時變化,並將資料推送到業務庫,但生產庫不能輕易改動,因此實時查詢就無法實現。非實時查詢也難以辦到,這是因為生產庫的資料極其龐大,不可能每次都全部取過來,只有用增量抽取的辦法,而判斷增量就需要在trade表中加入時間戳欄位。同樣,生產庫是不允許有這種改動的,因此也無法實現。

3、從能力上講,BIRT JAVA bean data source是真正能解決報表問題,它比Data Sources Join更具靈活性,也不需要修改生產庫。但這個方案只有一個缺陷:程式碼過於複雜,原因在於資料計算並非JAVA特長,若每次遇到跨庫問題都用硬編碼方式來實現,並不現實。

建議使用集算器,它是獨立的資料計算引擎,擁有不依賴於資料庫的計算能力,支援異構資料來源的混合運算,比較適合進行動態關聯再計算,事實上,可以把集算器看作是語法更簡單的BIRT JAVA bean data source。比如實現上面的問題,集算器指令碼只需6行:


A

1

=DB2.query("select runningNo,networkNo,outAccount,amount from trade")

2

="select"+crossJoinField+","+crossOtherFields+"from"+crossTable

3

=Mysql.query(A2)

4

=join(A1:trade,${tradeJoinField};A3:cross,${crossJoinField})

5

=crossOtherFields.array().("cross."+~).string()

6

=A4.new(trade.runningNo,trade.networkNo,trade.outAccount,trade.amount,${A5})

其中 tradeJoinField,crossJoinField,crossOtherFields,crossTable 為輸入引數。最後將計算結果返回給BIRT的DataSet進行報表展現。從此示例來看,集算器的引數用法很靈活,非常適合這類動態關聯查詢。由於它是專門的計算語言,所以較於常規辦法,跨庫計算的程式碼更加精煉易懂。

其實還有很多類似的跨庫、分庫計算問題,若有集算器SPL的輔助會很簡單,感興趣可以參考:

集算器提供了JDBC驅動,可以很方便的與BIRT等報表工具整合, 有使用和獲得它的方法。

關於集算器安裝使用、獲得免費授權和相關技術資料,可以參見 。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2699077/,如需轉載,請註明出處,否則將追究法律責任。

相關文章