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.mzph.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那样能够记住所有的咒语而随意的…