java数据引擎(十一):应用四

来源:互联网 发布:斯巴鲁 森林人 知乎 编辑:程序博客网 时间:2024/05/02 09:34

应用之四(2014)

上几篇谈的是在以前公司中的应用。

在新公司中,应用是早已上线的,由于有网站、客户端及第三方,因此,就有好几个应用,相互协作调用,笔者接触的是其中部分工程,其中一个核心应用,采用的是的spring+struts2+ibatis的架构(SSI),觉得作为互联网项目,这是有点偏重量级的,毕竟应用只是提供接口服务,如果能采用最轻量的设计,从性能、资源占用、吞吐量都会得到很大的优化。为此专门给主管写过一个建议报告。由于牵涉到的东西较多,并且他们不认为这会有大问题(我头一次听说不怕占内存,不用关心性能问题,因为他们强调有集群,硬件配置很高,F5控制负载均衡等等),因此就没有下文。

再说说持久层,几个应用采用的都是ibatis,几年前初次使用ibatis时,觉得很不错,但现在接触到这些项目后,才发现如此臃肿、如此不方便,每一个表都映射实体类(有的实体类还要实现一个接口类),都预先将条件查询类定义好,都事先写好增删改查语句,每一个表都伴随有几个相关的巨类。虽然ide工具可以自动生成有些代码,但需要手动写的细节很多,习惯了这一做法的开发员,可能觉得这很正常,复制粘贴修改,很快搞定。这种做法的问题是,大量非业务相关的工作要做;许多重复的、无用的代码要被虚拟机加载;从维护上、调试上带来许多不方便性。

另外,框架中采用了三层结构,action访问service,service访问dao,dao访问数据库,service又分接口及实现,dao也分接口和实现。service配置为prototype,dao是多层继承,每个父类子类代码合并起来一般达3、4千行,这会占用许多内存,每一次的请求,哪怕是个小小的请求,都伴随一系列过程,生成大量的java对象,当访问量大时,如果jvm不能及时回收,服务器容易出现内存溢出。(写本篇时,由于项目的预算变动,笔者和另外几人被安排转移到其它项目了,据说,现在时不时需要重启服务。)

 

下面看一个应用中查询订单的普通ibatis语句:


不说写这个语句(包括结果集的映射resultMap,这里没有显示)有多费事(这里的语句是通过工具自动生成的,但更多的与业务关联的语句是需要手动写的),从性能上看,它是很有局限性的,也许某处业务确实需要查出订单的全部38个字段信息,但一定还有更多的需求,比如只查38个字段中的任意几个(使用排列组合,有成千上万可能),如果就用上面这个语句,显然不符合sql的性能优化,如果新增符合性能要求的语句,那需要加成千上万的语句;另外,查询的条件只是根据order_id来限制的,如果想根据user_id或订单状态字段或票类等任意字段查询,那就必然再写sql,由于可以根据任意一个或几个字段作限制条件,这种组合也是无穷的。实际的应用中,只能是出现一个新需求,就增加一条配置语句,同样也面临是查询所有字段、还是只查所需字段的问题。使用动态构建语句,也难以解决上述的sql问题。

不管是修改sql、还是增加sql,都要考虑参数类,映射结果集。还得在service的接口及实现、dao的接口及实现中加入调用逻辑。这些分散在多处的代码合计一般都有几十行。这是在说开发繁琐,jvm在运行时,也要经过大量的类加载(包括单个很大的类)。

但如果使用UDBC引擎,根本就不存在这些问题,一切都游刃有余。上面的查询逻辑,如果使用引擎,只需一句代码(如果只想查询某几个字段,稍微改改即可。受访字段以外的任意字段,也可以通过延迟加载获取):

Mapresult=DataCenter.getMap(“odrers”,new Param(“order_id”,”1”));

 

或者用下面一句也可以,这是生成的实体类对象,如果算上Orders类的定义,当然就不是一行代码了,但类只定义一次,多次使用。

Ordersresult=DataCenter.getObject(“odrers”,new Param(“order_id”,”1”), Orders.class);

 

     在经历几次开发新需求、充分感受到ibatis的沉重与效率低下后,经过甲方客户的同意,在项目中应用了引擎,在配置上,唯一的改动是在web.xml中加了两行,在lib加了引擎的jar包。

     之后,有个新需求是,需要临时建一张表,将已有表的业务数据处理后放入新表中,导出为excel,临时表过不多久就要删除。

     由于是在现有应用上实现,如果按老套路,需要写sql配置文件、映射结果,增加新的service和dao,将来再删除。

     既然有了数据引擎,几行代码就搞定。时时都能感受到数据访问如此轻松简单。

虽然有的人能认可这个引擎,但也有人认为这不是正道,会不会隐藏问题,他们已经习惯了现有的做法,觉得ibatis用起来很好。主要是他们还没有真正了解这个东西。在一个已经上线运行的应用里,也没有正式介绍推广这个东西。

 

0 0
原创粉丝点击