java使用xml存储数据_用存储过程和 JAVA 写报表数据源有什么弊端?

用存储过程和 JAVA 写报表数据源有什么弊端?跟着小编一起来一看一下吧!

我们在报表开发中经常会使用存储过程准备数据,存储过程支持分步计算,可以实现非常复杂的计算逻辑,为报表开发带来便利。所以,报表开发中这样的存储过程并不少见:

c044b87b859060a5de3d613d28d95526.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 的优缺点可以发现,解决问题应该是沿着继承二者优点,改进缺点的方向进行。清晰起见,总结一下需要的点。

bae5891fee7a429e835c8653c8f9b35a.png

把主要的点列了一下,我们的目标就是找到支持这些点的技术手段(问号所在行)。

易开发、易维护

这注定了这些能力应该是报表工具内置的,这样报表开发人员自己就能使用工具搞定报表开发,而不必依赖其他人或团队;

热切换

热切换要求这个技术应该是解释执行的,这样才能做到实时修改实时生效;

支持多源

能够对接多种不同类型的数据源进行混合计算,比如文本和数据库表的 join;

低耦合、可移植

数据准备能力和报表呈现能力都报表内置了,自然与应用和数据源都解耦了,未来系统扩展自然毫无压力。

这样我们可以很容易想到在报表端增加一个计算模块,来替代存储过程或 JAVA 为报表准备数据,这个模块可以是由嵌入报表工具的脚本来实现,结构可以是这样的

a97e98a622ac4a9eff84a6ebdb06d2b8.png

脚本要具备完善的计算能力(什么计算都能算),支持多源,解释执行允许热切换这些能力。

善的计算能力(什么计算都能算),支持多源,解释执行允许热切换这些能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIT文件的三种状态

对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库 中了;已修…

嵌入式常见笔试题总结(2)

预处理器(Preprocessor)   1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)   #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL   我在这想看到几件事情:   1). #…

MAC OS上JAVA1.6 升级1.7,以及 maven3.2.1配置

一、我的MAC系统 预装的Jdk是1.6,由于需要使用eclipse MARs 2版本,故需要升级到1.7 二、下载JAVA jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 不知道为什么直接下非常慢,后来用的迅雷就超级快…

sql server 创建唯一性非聚集索引语句_数据库专题—索引原理

深入浅出数据库索引原理参见:https://www.cnblogs.com/aspwebchh/p/6652855.html1.为什么给表加上主键?1.平时创建表的时候,都会给表加上主键。如果没有主键的表,数据会一行行的排列在磁盘上,查找一个数据需要一条条的进行对比。而…

String,StringBuffer,StringBuilder区别

String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行…

oracle数据库更新语句_20_手把手教你学Python之操作数据库

数据库是数据的仓库,将大量数据按照一定的方式组织并存储起来,方便进行管理和维护,例如快速检索和统计等。数据库的主要特点:以一定的方式组织、存储数据;能为多个用户共享;与程序彼此独立。……数据库管理…

第十周学习进度

第十周 所花时间(包括上课) 10小时 代码量(行) 0行 博客量(篇) 4篇 了解到的知识点 对各组进行评价;思考并回复各组 转载于:https://www.cnblogs.com/qwer111/p/5470819.html

嵌入式常见笔试题总结(3)

1:设float a2, b4, c3;,以下C语言表达式与代数式 (ab)c计算结果不一致的是 A.(ab)*c/2 B.(1/2)*(ab)*c C.(ab)*c*1/2 D.c/2*(ab) 参考答案:B,因为a,b,c三个变量都是浮点数,所以在B答案中其结果是0,因为…

查询Oracle正在执行的sql语句

--查询Oracle正在执行的sql语句及执行该语句的用户 [sql] view plaincopy SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, paddr, sql_text 正在执行的SQL, b.machine 计算机名 FROM v$p…

WinForm 清空界面控件值的小技巧

WinForm 清空界面控件值的小技巧 原文:WinForm 清空界面控件值的小技巧在WinForm里面有时候需要清空自己输入内容或是选择的选项,以便重新操作流程,那么一般你是怎么清空界面各个控件值的呢?如果窗体里面控件,尤其是TextBox控件比…

int 取值范围_一定范围内的随机数

老司机的新问题,取得[min, max]范围的随机数。C版本的rand函数很不容易用对,直接用rand() % (max - min 1) min,这个公式不对。这个公式与取最低位的算法相同,而随机数的最低几位不一定等概率。Donald Knuth博士教导我们正确的用…

virsh的使用

2019独角兽企业重金招聘Python工程师标准>>> ###这里最先要完成的是对网卡的配置(os ubuntu14.04) 目的是实现vm上是以桥接的方式联网 修改/etc/network/interfaces # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback #auto eth0…

嵌入式常见笔试题总结(4)

1:用C语言实现大小端的测试 Int CheckCpu() { union { int a; char b; }c; c.a1; if(c.b1) printf(“小端”); else printf(“大端”); } 2:volatile的作用有哪些? Volatile第一变量相当于告诉编…

《java入门第一季》之类String类小案例

String类有许多获取方法,API文档里面可查看。针对获取方法,给出小案例。 /** 需求:遍历获取字符串中的每一个字符* 分析: 用到两个方法:char charAt(int index) 表示获取字符串指定索引的字符int length() …

同字母异序词 python_49. 字母异位次分组(Python)

题目 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 说明 所有输入均为小写字母。 不考虑答案输出的顺序。 示例 输入: ["eat", "tea", "tan", "ate", "nat&quo…

嵌入式常见笔试题总结(5)

1、 如何在C中初始化一个字符数组。这个问题看似很简单,但是我们要将最简单的问题用最严谨的态度来对待。关键的地方:初始化、字符型、数组。最简单的方法是char array[];。这个问题看似解决了,但是在初始化上好像还欠缺点什么,个…

SQL Server - 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)

因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分。而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建。 三篇文章各自的链接: SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn&…

嵌入式常见笔试题总结(6)

一、常识理论题 1、 简述嵌入式操作系统有哪些,你用过哪几种,简述其特点、优势及劣势?(5分) 2、 请描述控制及提高嵌入式软件质量有哪些办法,在开发过程中怎么才能保证嵌入式软件的可靠性?(5分)…

python 3.6.5编译安装_Linux系统安装Python3.6.5

Linux系统安装Python3.6.5 1、下载Python3.6.5 wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 如果报command not found则执行:yum -y install wget命令后再进行下载 也可下载好安装包进行手动上传 2、安装Python3.6可能使用的依赖 yum install o…

从传统运维到云运维演进历程之软件定义存储(一)

运维是企业业务系统从规划、设计、实施、交付到运维的最后一个步骤,也是重要的步骤。运维从横向、纵向分可以分为多个维度和层次,本文试图抛开这纷繁复杂的概念,讲述一个传统的企业级运维人员转型到云运维人员,尤其是软件定义存储…