5大java数据计算层的解决方法

我们都知道,数据计算层是指介于数据持久层和应用程序层之间,负责计算来自数据持久层的数据,并将计算结果返回应用程序层的层次。而JAVA的数据计算层主要是为了降低应用程序层和数据持久层之间的耦合性,分担它们的计算压力。

因此,它应当符合如下特征:

1. 可以统一的计算来自任意数据持久层的数据,不仅包括数据库,也包括非数据库的Excel/Txt/XML。其中对最常见的结构化数据的计算是重点。

2. 可以统一的进行不同种类数据源之间的相互计算。不仅包括异种数据库之间,也包括数据库和非数据库之间的计算。

3. 数据库和计算层、计算层和JAVA代码之间要有尽量低的耦合性,可以方便移植。

4. 可以是非JAVA架构,但必须能和JAVA方便的集成。

5. 要有较高的开发效率,包括脚本编写,可读性,调试,日常维护。

6. 复杂计算目标和大数据计算是流行趋势,数据计算层应该能直接支持。

考察了5种数据计算层:Hibernate,集算器,SQL,iBatis,R languae。考察的指标包括:成熟度、低耦合性、脚本编写、集成、界面友好性、性能、复杂计算、大数据支持、非数据库计算、跨库计算、调试方便性。

Hibernate

Hibernate是轻量级的ORM框架,由Gavin King创造,现在属于JBOSS。它是非分布式环境中(intranet)中优秀的数据计算层。它具有彻底的基于对象的访问方式,而集算器和iBatis只能算半对象或类对象。

Hibernate几乎做到了计算脚本、JAVA代码、数据库之间的彻底解耦。但计算能力不足使它仍然在很多地方依靠SP/SQL,这是个尴尬的问题。

另外EJB的JPA属于数据计算层协议,但考虑到Hibernate是实际上的JPA,所以不介绍它了。

成熟度:4星。经过10多年的市场检验,Hibernate已经非常成熟。

低耦合性:4星,这是Hibernate出现的原因。但本地SQL仍然是不可避免的,难以完美移植。

脚本编写:2星。Hibernate的计算方式是对象引用和HQL,前者最容易,给5星;但后者的学习难度比SQL高,而且调试极困难,开发效率不如SQL,2星;另外有些计算还是不得不依靠SQL,2种语言混用,困难,给2星。平均3星。

集成:2星。Hibernate是纯java架构,只需要复制jar包和N个映射文件,并利用好session,入门比较容易。但驾驭Hibernate的缓存是必修课,这需要极高的架构设计能力,不建议普通程序员接触。当然,ORM的这种天生的缺陷在其他数据计算层并不存在。

界面友好性:0星。Hibernate有对象生成器;但缺乏最重要的HQL图形化设计界面,等于没有GUI。

性能:3星。支持3级缓存,虽然一定不如SQL,但据我个人经验其综合性能达到了SQL的60%。

复杂计算:0星。不支持复杂计算。需要依靠SQL/外部工具实现。

大数据支持:1星。不直接支持hadoop架构,但有人在研究。

非数据库计算:0星。不直接支持非数据库的计算。

跨库计算:0星。不直接支持库间的计算。每个HQL只支持单库。

调式方便性:0星。很难调试,对程序员来讲,这是致命的。

集算器

集算器是最近出现的新型JAVA计算层,擅长复杂的、跨库的计算。和其他数据计算层不同,集算器只是将SQL作为一种数据源,而取到数据后的计算则完全和SQL无关。PJA/hibernate则被迫开放SQL接口,用来实现自己处理不了的计算。

成熟度:1星。在市场出现仅1年,应用的广度和深度都不如其他数据计算层。

低耦合性:4星。脚本独立于数据库和Java代码,算法和具体数据库无关,耦合性低。可以轻松移植到不同的数据库。因为输出接口为JDBC,所以也可以轻松移植到报表,这是其他数据计算层所不具备的特征。

脚本编写:4星。脚本写在网格中,单元格可以按格名调用,可以直接观察每一步的计算结果,复杂目标可以分解为简单步骤。但它的语法偏向对象引用(但不是对象),与偏向描述语句的SQL风格不同,需要学习。不过JAVA程序员到底喜欢哪一种,还很难说。

集成:5星。集算器是纯JAVA架构,输出JDBC接口,集成不需要学习。用过任何一种数据库的程序员都可以无障碍使用。

界面友好性:4星。独立的图形化编辑器,使用方便直观。但帮助系统不够友好。

性能:2星。全内存计算,数据量不能太大。

复杂计算:5星。这是集算器出现的原因。

非数据库计算:3星。支持Excel/Txt,但不支持xml或webService.

大数据支持:4星。能访问HDFS,同步宣称支持并行计算,但细节还不太了解。

跨库计算:5星。集算器语法与具体数据库无关,天生支持跨库计算。

调式方便性:5星。调式功能完善,而且使用非常方便,可以观察到最细粒度的计算步骤。其他数据计算层远远达不到这种方便性。

SQL

SQL/SP/JDBC在这里属于一类,这是老牌的数据计算层,性能和灵活性是它的优势。但随着新情况的不断出现,单纯用SQL已经难以满足需求,比如: JAVA开发规模的扩大,数据量的剧增,复杂计算问题的涌现。虽然SQL得高分的指标不多,但都是权重最高的。

成熟度:5星。最成熟的。

低耦合性:0星。耦合性极高。除了在实验室之外,几乎不可能写出与数据库无关,与代码无关的计算脚本。

脚本编写:3星。SQL实际很难写出也很难维护,需要大量的时间去学习,好在SQL非常成熟,资料丰富论坛很多。但各种数据之间的不兼容也是个巨大的障碍,这是Hibernate之所以流行的主因。

集成:5星。JAVA程序员的第一课就是用JDBC连接数据库。

界面友好性:5星。有大量的SQL开发工具,成熟度都很高,我自己用过不下10种。

性能:5星。数据库直接支持的语言,性能最高。

复杂计算:3星。SQL适合普通的计算问题,可以解决复杂问题但非常困难(而Hibernate是完全不能)。SP的出现并不能有太大的改善。代码难以拆分,复杂目标难以分解为简单步骤是主因。

大数据支持:1星。个别数据库厂商表示已经支持大数据了,但这让SQL语句的不兼容程度加剧了,而且我也没见过成功案例。

非数据库计算:1星。不直接支持。采用ETL/数据仓库可以达到这个目的,但代价巨大。

跨库计算:1星。个别数据库支持,但性能较差,也可以采用DBLink和l

时间: 2024-09-21 01:53:11

5大java数据计算层的解决方法的相关文章

【数据蒋堂】报表的数据计算层

[导读]我们在上一期[数据蒋堂]报表应用的三层结构一文中解释了报表应用结构中数据计算层的必要性,以及可以使用报表工具自定义数据源接口来实现计算层.本期我们就来讨论一下使用报表工具的自定义数据源是否可以方便地实现数据计算层以及独立计算层的优势. 在计算层中要完成一些复杂的计算逻辑,因此要有可编程的能力,而基于自定义接口可以采用报表工具的宿主语言(即用于开发报表工具的程序设计语言)进行开发,在功能方面没有问题,不过,实际应用中却仍有不少缺陷.更好的方式是实现一个显式的数据计算层,在其中提供可解释执行

【数据蒋堂】第10期:报表的数据计算层

我们在上一期已经解释了报表应用结构中数据计算层的必要性,以及可以使用报表工具自定义数据源接口来实现计算层.在计算层中要完成一些复杂的计算逻辑,因此要有可编程的能力,而基于自定义接口可以采用报表工具的宿主语言(即用于开发报表工具的程序设计语言)进行开发,在功能方面没有问题,不过,实际应用中却仍有不少缺陷.更好的方式是实现一个显式的数据计算层,在其中提供可解释执行的脚本功能,把数据源计算独立出来. 我们从四个方面来分析后者的优势. 代码编写 报表工具的宿主语言一般是Java.C#等高级语言,这类语言

mysql 导出 xls 与csv 数据实现与乱码解决方法

mysql教程 导出 xls 与csv 数据实现与乱码解决方法 下面关于 先来看mysql 导出导入 xls 与csv数据实例方法,同时在碰到导入乱码时的有效解决方法, 在mysql命令行下执行以下sql语句: mysql>select * from xi_table into outfile 'd:www.111cn.nettest.xls'; 有时候有excel打开的时候会出现乱码, 因为office默认的是gb2312编码,服务器端生成的很有可能是utf-8编码,可以在服务器端使用icon

messagebox相对于div层居中解决方法

messagebox相对于div层居中解决方法 public void wndprocret(object sender, wndprocreteventargs e)         { switch (e.cw.message)             {                 case wndmessage.wm_initdialog:                 case wndmessage.wm_unknowinit:                     user3

微信小程序首页数据初始化失败的解决方法

一. 问题描述 用户首次后再次进入小程序时,我们通常需要通过获取用户openid或unionid用作唯一标示与后台进行数据交流,初始化用户信息.当我们通过第三方服务器跟微信建立请求时,微信需要用户确认是否公开信息.如图1,从console可以看到,在请求的同时,我们的首页index已经加载完成,图中初始化数据显示为空.无论我们将请求信息写在app.js的onload中或者index.js中,当我们点击确认后,请求信息才执行success方法,将第三方服务器返回的数据处理,这样的因需要用户点击而产

Ajax请求在数据量大的时候出现超时的解决方法_extjs

 最近在用EXtjs做项目,在加载数据量特别大的时候会出现加载超时现象,在FB下查看,原来是ext默认ajax请求30秒. 在网上搜到下面的解决方法,以备参考和其他人参考. ExtJS做Ajax请求的时候,默认的相应时间是30秒,如果后来数据查询时间超过30秒,ExtJS就会报错. 这就需要修改ExtJS的超时时间: 2种方法: 1:在Ajax请求的时候加:(timeout: 100000000)属性 复制代码 代码如下: Ext.Ajax.request({ url: 'foo.php', s

Java中超大ArrayList的解决方法,求指导

问题描述 刚刚接触java,尽量把问题描述清楚.我有这么一个小模块,从文本文件读入数据,根据读入数据构造对象,把新对象压入arraylist集合里面,在后面模块依次调用集合里的对象进行处理.文本文件是按行来的,每行5个double类型的参数,就是每行能生成一个对象.生成的对象会在后面调用处理,对象之间没有关联.当对象数量在10的6次方这个量级时,eclipse运行内存溢出,把Xms和Xmx调到4000M后,可以正常运行,但是速度到后面变的很慢.因为是对集合里面的对象依次处理的,每个对象处理过程是

asp和php下textarea提交大量数据发生丢失的解决方法_php技巧

我用textarea提交大量的阿数据 我开始字段类型选的是mediumtext,数据有丢失 后来我改成了longtext,数据依然丢失, 而且发现和mediumtext提交到数据库中的数据量是一样的, 并没有增加.该怎样解决呢? asp下只需要用下面的方法即可 复制代码 代码如下: Sub Content()     Dim i,sContent     ' 取提交过来的数据     ' 据说对大表单的自动处理,要使用循环,否则大于100K的内容将有可能取不到,单个表单项的限制为102399字节

Java ConcurrentModificationException异常原因和解决方法

在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 若有不正之处请多多谅解,并欢迎批评指正 请尊重作者劳动成果,转载请标明原文链接: http://w