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

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

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

24cd08cce263f4c39d3f58fa55602272.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 的優缺點可以發現,解決問題應該是沿著繼承二者優點,改進缺點的方向進行。清晰起見,總結一下需要的點。

4126b1d7d9c0d4b20affcec029cd8f12.png

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

f38244555d5646cd8518dcacf685d6ba.png


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

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

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

相關文章

mysql多實例安裝啟動_MySQL多實例安裝啟動

Tips:之前我們的一個實例是mysql3306,我們現在再安裝一個mysql33071。和之前一樣,創建需要的目錄文件夾mkdir -p /data/mysql/mysql3307/{data,logs,tmp}創建完 就給文件授權chown -R mysql:mysql /data/mysql/mysql3307/2.進入mysql3307cd /…

用vhdl實現4位加減法計數器_32位加減法器設計

功能特性設計思路基于一位全加器,設計32位并行加法器。并行加法器中全加器的位數與操作數相同,影響速度(延時)的主要因素是進位信號的傳遞。主要的高速加法器【1】有基本上都是在超前進位加法器(CLA)的基礎…

用vim + xdebug 來追蹤thinkphp的執行過程

tree命令的使用幾個有實際應用的參數 -a 這是默認的 -d: 只顯式目錄, 不需要顯式目錄下的文件 -L: 列出顯式的深度. 當前目錄下的所有東西為第一級...在tp下, 有多個Common但是它們的含義不同:Application|- Common (前后臺都使用的公共文件所在目錄)|- Common (公共函數目錄)…

mybatis 中#與$的區別

MyBatis/Ibatis中#和$的區別 #{} 解析的是占位符?可以防止SQL注入,比如打印出來的語句 select * from table where id? 然而${} 則是不能防止SQL注入打印出來的語句 select * from table where id2 實實在在的參數

綠色背景配什么顏色文字_灰色褲子配什么顏色上衣好看

我們許多人都喜歡灰色。灰色是一種很酷的自然色。灰色大氣而沉穩。它介于黑白之間,是一種多用途的顏色,與其他顏色搭配將變得時尚而優雅。那么秋冬季節灰色褲子配什么顏色的上衣好看呢?接下來就來看一組時尚大人的灰色褲子穿搭吧。look1 保溫…

浮柵場效應管 符號_場效應管主要參數與特點,場效應管與其他管子的對比

場效應晶體管(Field Effect Transistor縮寫(FET))簡稱場效應管。主要有兩種類型:結型場效應管(junction FET—JFET)和金屬-氧化物半導體場效應管(metal-oxide semiconductor FET,簡稱MOS-FET)。場效應管由多數載流子參與導電,也稱為單極型晶體…

linux軟鏈接

原文地址:http://biyutong.iteye.com/blog/1445699 ------------------------------------------------------------------------ 實例:ln -s /home/gamestat /gamestat linux下的軟鏈接類似于windows下的快捷方式 ln -s a b 中的 a 就是源文件&am…

MySQL主鍵自增長報duplicate_MySQL使用on duplicate key update引起主鍵不連續自增

innodb_autoinc_lock_mode中有3種模式,0,1,2,數據庫默認是1的情況下,每次使用insert into … on duplicate key update 的時候都會把簡單自增id增加,不管是發生了insert還是updateinnodb_autoinc_lock_mode參數詳解tradition(innodb_autoinc_lock_mode0) 模式&#…

super go_Go 簡單性的價值:來自對 Go 倍加青睞的谷歌軟件工程師的自述

點擊上方藍色“Go語言中文網”關注我們,領全套Go資料,每天學習 Go 語言Go 語言最近幾年逐漸獲得越來越多的開發者的喜歡。在 Go 社區前不久剛剛慶祝Go誕生10周年生日之際,谷歌云軟件工程師 Benjamin Congdon 發表個人博客(11 月 11 日發表)&a…

判斷鼠標是否在元素上_是否清掃保潔、是否霧撒降塵?江城環衛車裝上了北斗,動動鼠標就知道了...

楚天都市報12月1日訊(記者盧成漢 通訊員金嬋 潘婷)環衛車裝上北斗定位系統,它是否上路進行清掃保潔,是否霧撒降塵。城管隊員通過手機或電腦,就可以查到它的運行狀態。1日,東湖高新區城管執法局稱,該區運行的北斗智能環…

Object 對象詳解

2019獨角獸企業重金招聘Python工程師標準>>> 面向對象的核心思想:“找合適的對象,做適合的事情”。 合適的對象: 1. 自己描述類,自己創建對象。 2. sun已經描述了好多常用的類,可以使用這些類創建對象。 API&#xff0…

vi/vim命令

概述 vi: Visual Interface vim: VI iMproved vim模式 有三種: 編輯模式(命令模式) 如:通過命令新增一行,刪除一行,復制一行,光標移動等 輸入模式 輸入模式在屏幕末尾一定有這個“-- INSERT --” 末行模式 ESC&…

python條件判斷true_Python中的True,False條件判斷實例分析

本文實例講述了Python中的True,False條件判斷用法。分享給大家供大家參考。具體分析如下:對于有編程經驗的程序員們都知道條件語句的寫法:以C為例:代碼如下:if (condition){doSomething();}對于Python中的條件判斷語句的寫法則是下面的樣子&a…

python安裝報錯類型_解決Python安裝cryptography報錯問題

解決Python安裝cryptography報錯問題錯誤一:gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DUSE__THREAD -DHAVE_SYNC_SYNCHRONIZE -I/usr/include/ffi -I/usr/include/libffi -I/usr/include/python2.7 -c c/_cffi…

使用ntpdate校正linux系統的時間

原文地址:http://blog.csdn.net/lixianlin/article/details/7045321 ------------------------------------------------------------------------------------- 當Linux服務器的時間不對的時候,可以使用ntpdate工具來校正時間。 安裝:yum in…

Visual Studio 2017 15.6發布

\看新聞很累?看技術新聞更累?試試下載InfoQ手機客戶端,每天上下班路上聽新聞,有趣還有料!\\\微軟發布了Visual Studio 2017的第6次升級。和之前的發布一樣,此次升級包含多項Bug修復和整個IDE使用體驗的改善…

主mysql刪除從服務不同步_MySQL主從不同步解決

由于binlog日志帶多刪除了幾個后發現MySQL主從不同步1、由于binlog日志帶多刪除了幾個后發現MySQL主從不同步mysql> show slave status\G;Slave_IO_Running: NoSlave_SQL_Running: Yes查看報錯日志為[ERROR] Slave I/O: Got fatal error 1236 from master when reading data…

python切片是什么_python列表切片是什么

我們基本上都知道Python的序列對象都是可以用索引號來引用的元素的,索引號可以是正數由0開始從左向右,也可以是負數由-1開始從右向左。在Python中對于具有序列結構的數據來說都可以使用切片操作,需注意的是序列對象某個索引位置返回的是一個元…

cat-grep-sed應用案例

案例&#xff1a; 已知文件test.txt內容為&#xff1a; test liming xiaoming 請打印出test.txt內容時&#xff0c;不包含xiaoming字符串的命令。 創建文件test.txt [roothello110 testdata]# cat >>test.txt<<EOF > test > liming > xiaoming >…