java實現報表_用存儲過程和 JAVA 寫報表數據源有什么弊端?

用存儲過程和 JAVA 寫報表數據源有什么弊端?跟著小編一起來一看一下吧!

我們在報表開發中經常會使用存儲過程準備數據,存儲過程支持分步計算,可以實現非常復雜的計算邏輯,為報表開發帶來便利。所以,報表開發中這樣的存儲過程并不少見:

f243fc55667fccc81b7664b5a3ea7f19.png

3008 行,141KB 的存儲過程,會給報表開發帶來什么不好的影響?1. 編輯調試性
存儲過程難以編輯調試,這樣幾千行存儲過程的開發周期往往要以周或月計,這樣會嚴重影響報表的開發效率,而業務提的報表需求似乎都“很急”。2. 維護性
相對開發的一次性,維護的工作可能要經常做。實際業務中報表經常會修改,這種現象叫做報表業務的穩定性差。報表的數據準備邏輯變化,修改上千行的存儲過程對絕大多數報表開發人員來說都是噩夢。
有時這樣的報表會分兩撥人來做,DBA 或專業程序員負責編寫存儲過程給前端報表開發人員做報表,這樣就避免了報表開發人員寫存儲過程。但這樣報表修改的流程會變長,修改一張報表涉及多個人員之間溝通(還包括業務人員),如果負責報表前后端的兩撥人隸屬不同的團隊就更麻煩了。3. 知識傳承
從維護性可以直接引出另一個“知識傳承”的問題。還是拿上面的報表為例,如果一個新人要改上面的報表,你覺得他要多久能看懂存儲過程,改完報表?
當然,這個問題還涉及很多管理方面的手段,單純從技術本身來看,這樣的報表想要很好地傳承知識是很難的。4. 安全性
對存儲過程的修改需要較高的數據庫權限,而報表經常要改就要經常操作數據庫,這對數據庫安全也是一個隱患,同樣需要強管理機制才能保障一二。5. 移植性
現在絕大多數規定禁止使用存儲過程的原因,首當其沖的就是存儲過程沒有移植性。如果未來數據庫發生變化需要遷移,不管將來是更換數據庫類型,還是系統擴展(分表分庫),大量無法移植的存儲過程絕對是最頭疼的問題。
當然,“換庫”這件事情即使在今天仍然不會頻繁發生,但是只要發生一次就夠受了(有國產化或系統擴展預期的就要注意了)。6. 耦合性
從維護性、安全性和移植性看來,存儲過程會導致報表應用(前端)和數據庫(后端)緊耦合。緊耦合除了會導致前面的三個問題外,還會讓數據庫編的臃腫,影響數據庫性能。
重要的事情說好多遍,報表的業務不穩定,報表除了經常增加和修改,有時還會刪除(不用了),而為這個報表準備的存儲過程還在數據庫里,這時想要刪掉這個存儲過程就比較難了。
為什么?
因為你不知道是不是還有其他程序在共用這個存儲過程,刪除會不會對其他程序產生影響。結果就是數據庫的存儲過程越積越多導致數據庫臃腫,而有的存儲過程還會涉及自動運行,雖然存儲過程可能不再使用,但仍然在消耗數據庫資源,長此以往數據庫性能下降就成為必然了。7. 多源支持
存儲過程運行在封閉的數據庫內,無法進行跨多數據源混合計算。關于多源問題,幾年前在報表開發還不顯著,那時大家都用關系庫;但現在不一樣了,同一個報表的數據可能來自多個不同類型的數據源(RDB/NoSQL/TxT/Excel/Hadoop/ES 等等),這時存儲過程就無能為力了。如何搞定這些問題?
有沒有辦法解決存儲過程帶來的這些問題呢?
當然有!
沒有什么是硬編碼解決不了的!用 JAVA 替代存儲過程,脫離數據庫運行來解決上面的問題(自行搜索 SOA 和微服務理念)。存儲過程一個顯示的好處是可以分步實現報表數據準備邏輯,這個優點 JAVA 也有,甚至比存儲過程更徹底,說句文縐縐的話:JAVA 的離散性更好。
只是 JAVA 寫起來比較麻煩,對于報表開發人員來講太難了,如果還要加一個修飾詞那就是太 XX 難了。存儲過程使用的 SQL 語言非常適合做集合運算,分組匯總一句 group by 就寫出來了,反觀 JAVA 就不具備這個優點了,分組匯總可能要寫上幾十上百行才行(類庫缺失會讓開發復雜度急劇上升,想想你為什么不用匯編寫程序而要用 JAVA?)。
JAVA 還有一些其他的問題也不容忽視。不支持熱切換
JAVA 還有一個非常致命的缺點,就是不支持熱切換。報表經常要改(又來一遍),修改報表數據源以后還要重新編譯、重啟應用才能生效,對絕大多數業務系統都是不能接受的。報表講究的不僅是查詢立等可取,修改也要實時生效才行。報表與應用緊耦合
與使用存儲過程會導致報表與數據庫緊耦合類似,用 JAVA 準備報表數據源會導致報表模塊和應用的其他業務模塊緊耦合不宜維護。
我們知道,報表大多數情況都是作為一個模塊集成到應用系統提供報表查詢服務,集成的方式可以是 API(jar 包)方式緊集成;也可以將報表單獨發布成服務,通過服務調用的方式松集成,這樣報表服務器產生的任何壓力或問題都不會影響應用系統(高可用)。
*API 緊集成后,由于報表數據源是 JAVA 寫的,這樣就要和主應用的代碼一起打包,無法作為獨立的模塊維護,而未來想要拆分也基本不可能了;
* 服務松集成則完全無法實現。
所以,用 JAVA 寫報表數據源雖然可行,但也不是特別理想。
那有沒有其他辦法呢?
我們比較一下存儲過程和 JAVA 的優缺點可以發現,解決問題應該是沿著繼承二者優點,改進缺點的方向進行。清晰起見,總結一下需要的點。

2c1ed76635edbc9e0f29462e99599a18.png

把主要的點列了一下,我們的目標就是找到支持這些點的技術手段(問號所在行)。易開發、易維護
這注定了這些能力應該是報表工具內置的,這樣報表開發人員自己就能使用工具搞定報表開發,而不必依賴其他人或團隊;熱切換
熱切換要求這個技術應該是解釋執行的,這樣才能做到實時修改實時生效;支持多源
能夠對接多種不同類型的數據源進行混合計算,比如文本和數據庫表的 join;低耦合、可移植
數據準備能力和報表呈現能力都報表內置了,自然與應用和數據源都解耦了,未來系統擴展自然毫無壓力。
這樣我們可以很容易想到在報表端增加一個計算模塊,來替代存儲過程或 JAVA 為報表準備數據,這個模塊可以是由嵌入報表工具的腳本來實現,結構可以是這樣的

0fe17ff6940cf8bb27e082d80ee31cad.png


腳本要具備完善的計算能力(什么計算都能算),支持多源,解釋執行允許熱切換這些能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringMVC學習筆記整理

SpringMVC學習筆記 以下是我整理的SpringMVC學習筆記: 導入jar包 一:springmvc工作流程。 ①. servlet容器初始化一個request請求 ②. DispatcherServlet分發器負責發送請求到映射器. ③. despatcherServlet把請求交給處理器映射Mapping&…

Java EE重新審視設計模式:異步

盡管您可能找不到作為設計模式列出的異步方法調用,但我還是值得一提。 因此,這是我的JavaEE Revisits設計模式系列的最后一篇文章。 異步方法調用只不過是多線程。 基本上,它是指將在單獨的線程中運行的方法調用,因此主&#xff0…

am335x watchdog

am335x watchdog 內核文檔kernel/Documentation/watchdog Qtaplex:~/kernel/7109/linux-3.2.0/Documentation/watchdog$ ll total 88 drwxrwxr-x 3 Qt Qt 4096 Jun 8 15:11 ./ drwxrwxr-x 94 Qt Qt 12288 Apr 28 13:09 ../ -rwxrwxr-x 1 Qt Qt 576 Nov 20 2013 00-INDEX -rwxrw…

springboot2 使用hikaridatasource 并測試_基于Spring Boot 2.x的后端管理網站腳手,源碼免費分享...

基于Spring Boot 2.x 的 Material Design 的后端管理網站腳手架 :提供權限認證 用戶管理 菜單管理 操作日志 等常用功能去繁就簡 重新出發基于Spring Boot 集成一些常用的功能,你只需要基于它做些簡單的修改即可。功能列表:權限認證權限管理用…

測試驅動開發–雙贏策略

敏捷從業人員談論測試驅動開發 (TDD),所以許多關心代碼質量和可操作性的開發人員也是如此。 我曾幾何時,不久前設法閱讀了有關TDD的文章。 據我了解,TDD的關鍵是: 編寫測試,但失敗 代碼&#x…

設計模式學習(三)——裝飾器模式

前言 距離上一次正兒八經地寫隨筆已經有一段時間了,雖然2月10號有一篇關于泛型的小記,但是其實只是簡單地將自己的學習代碼貼上來,為了方便后續使用時查閱,并沒有多少文字和理解感悟。之所以在今天覺得有必要寫點東西,…

swift - 導航欄設置

話不多,直接貼代碼: let nav UINavigationController.init(rootViewController: viewController) nav.topViewController?.title title// 設置導航欄的標題 nav.navigationBar.tintColor .whiteColor()// 設置push出的導航欄的返回顏色(箭頭及文字) …

mysql5.6主從復制(讀寫分離)方案_MySQL5.6主從復制(讀寫分離)方案

MySQL5.6主從復制(讀寫分離)方案一、前言:為什么MySQL要做主從復制(讀寫分離)?通俗來講,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,業務系統性能會降低。為了提升業務系統性能,優化用戶體驗,可以通…

在實踐中使用延遲隊列

通常,在某些情況下,當您有某種工作或作業隊列時,有必要不立即處理每個工作項或作業,而是要延遲一些時間。 例如,如果用戶單擊一個按鈕來觸發要完成的某項工作,而一秒鐘后,用戶意識到他/她錯了&a…

PCL學習八叉樹

建立空間索引在點云數據處理中有著廣泛的應用,常見的空間索引一般 是自頂而下逐級劃分空間的各種空間索引結構,比較有代表性的包括BSP樹,KD樹,KDB樹,R樹,四叉樹,八叉樹等索引結構,而…

Android實現自定義帶文字和圖片的Button

在Android開發中經常會需要用到帶文字和圖片的button,下面來講解一下常用的實現辦法。 一.用系統自帶的Button實現 最簡單的一種辦法就是利用系統自帶的Button來實現,這種方式代碼量最小。在Button的屬性中有一個是drawableLeft,這個 屬性可以…

mysql語句中的注釋方法_MySQL語句注釋方式簡介

MySQL支持三種注釋方式:1.從‘#字符從行尾。2.從‘-- 序列到行尾。請注意‘-- (雙破折號)注釋風格要求第2個破折號后面至少跟一個空格符(例如空格、tab、換行符等等)。3.從/*序列到后面的*/序列。結束序列不一定在同一行中,因此該語法允許注釋跨越多行。…

aqlserver實用程序_sqlserver命令提示實用工具的介紹

除上述的圖形化管理工具外,SQL Server2008還提供了大量的命令行實用工具,包括bcp、dtexec、dtutil、osql、reconfig、sqlcmd、sqlwb和tablediff等,下面進行簡要說明。dtexec實用工具用于配置和執行SQL Server2008 Intgration Services包。用戶…

使用Java和Scala將Play Framework 2應用程序部署到Openshift

幾個星期, 馬克阿特伍德 ( Mark Atwood) , 豪爾赫阿里斯 ( Jorge Aliss )和我塞巴斯蒂安 斯卡塔諾 ( SebastinScarano)參加了紅帽網絡研討會LETS PLAY! 在云端&#xff1…

LintCode 387: Smallest Difference

LintCode 387: Smallest Difference 題目描述 給定兩個整數數組(第一個是數組A,第二個是數組B),在數組A中取A[i],數組B中取B[j],A[i]和B[j]兩者的差越小越好(|A[i] - B[j]|)。返回最小差。 樣例 給定數組A …

android框架----下沉文字Titanic的使用

Titanic is a simple illusion obtained by applying an animated translation on the TextView TextPaint Shaders matrix. Titanic的使用 Titanic的使用,項目結構如下: 一、下載Titanic并且部署到項目中 Titanic的項目地址: https://github…

linux 自動安裝mysql_Linux安裝mysql

一、下載這里我創建了一目錄software用于存放我們待會要下載的mysql包,先去到該目錄命令:cd /software命令:wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar下載完成后,你會在software這個…

Quartz Scheduler插件–隱藏的寶藏

盡管在官方文檔中進行了簡要描述,但我相信Quartz插件了解得還不夠多,看看它們有多有用。 本質上,Quartz中的插件是方便的類,用于包裝基礎偵聽器的注冊。 您可以自由編寫自己的插件,但我們將專注于Quartz隨附的現有插件…

mysql查詢表名匹配只有字母的_MySQL按某些匹配字母查詢表

MySQL查詢是MySQL的核心功能,有時候我們需要查找帶有某些匹配字母的表。下文對該MySQL查詢方式作了詳細的介紹,供您參考。在MySQL中我們可以使用LIKE或者NOT LIKE操作符進行比較。在MySQL中模式默認是不區分大小寫的。查詢示例,student表----…

hdu 1181(Floyed)

變形課 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 20748 Accepted Submission(s): 7494 Problem Description呃......變形課上Harry碰到了一點小麻煩,因為他并不像Hermione那樣能夠記住所有的咒語而隨意的…