Spring, Hibernate, Struts2项目总结

今天做完了第一个正式的公司内部的Spring Hibernate Struts2项目,这个项目与我进入公司后的任何一个项目都不相同,有了很大的收获,值得总结一下。

项目时间:3.5 week

项目人员:

  • teamleader : 1
  • QA : 1
  • 开发,测试人员:4

发现的问题:

这个项目采用的是比较新的技术,因此在构建项目框架,编码过程中,遇到了不少困难,主要集中在以下几个方面:

1,没有很好的OO意识,面向过程编程

2,不愿意重构代码,影响可读性,可测性

3,对持久化框没有大致的了解,对数据持久化的认识仍然停留在 关系数据库的层面上。

4,公共模块变化较多,而且不能及时反应给其他模块开发着。

5,只关注功能实现,忽略了性能调试。

关于以上几个问题我有以下几点建议:

1,在开始编码之前,详细地分析业务需求,然后从需求中抽象出业务对象,充分利用 设计模式 来设计自 己的对象以获得更好的可读性和扩展性。

2, 编码过程中及时地重构自己的代码,提取公用函数,抽取对象,尽量把每个函数的行数控制在十几行的范围内,遵循函数功能单一化的原则。

3,理解Hibernate的原理,采用面向对象的观点去理解数据库。

4,及时地和开发人员沟通,共通模块的性能是整个系统性能提升的关键。

5,尽可能减少代码里的bad smell,用最少的代码做最多的事情,尽量少用循环。

经验:

当然,由于我负责这个系统框架的构建,所以学到的东西也很多。 1,系统采用贫血模型,把对象的行为(service)和状态(pojo)分离,系统结构如下:

  • action
  • service
  • dao
  • pojos
  • utils 系统由上至下依赖,下层的实现对上层隔离(面向接口编程),使得系统的可扩展性大大提高。 2,junit的使用,在此次开发中我采用了TDD开发的方式,当然这只是对我个人而言,我没办法说服别人:-),通过这个项目,我真实体会到了测试驱动开发的威力,在开发后期做性能优化时,只要跑一下test suite,看到了可爱的绿条,我就可以放心地commit source了。无需胆战心惊地去部署到服务器上,然后造数据,跑画面。当然我没有实现case的100%覆盖,而且对action的测试也比较难(目前对我来说)

3,如果你要问我第一次使用TDD方式开发会不会很困难,还是比较容易的,因为我做的主要是公共模块,那些模块比action要好测试些。

4,Hibernate 通过一个玩具项目,一个正式项目,我对Hibernate的认知有了一定的积累,特别是在性能优化方面,有了不少收获。现在总结如下:

  • 尽量使用lazy加载,如果需要eager加载某个associated object,通过detachedCriteria 设置FetchMode.JOIN来连表加载对象,个人觉得比起FetchMode.SELECT性能好些。
  • 对于one-to-many关系,如果关联配置在 one 这一方,建议配置batch-fetch(批量抓取),抓取的size设置在5到10之间比较好。
  • 在获得某个entity的list时,也可以通过对该entity配置batch-fetch 以获取更好的性能。

5,struts2 与struts1相比,struts2让人眼前一亮,更少的侵入性 保证了struts2的action更加容易测试。

关于strut2中的TypeConverter 和 validation 在上一篇文章中已经提及,这里我想再说说struts2的拦截器。拦截器是struts2的精髓,struts2自带的拦截器(在struts-default.xml中)就可以完成大多数的web开发需求,有空我会把struts-default.xml中的拦截器做个介绍。 在使用struts2的过程发现一个action中的函数有被执行两次的情形,原因是使用了struts2标签 的同时调用了 onclick()函数,在这里给大家提个醒,别再在这上面浪费时间:-)

最后还有个大难题: 我们的这个系统使用了c3p0数据库连接池,在系统运行一段时间以后,会出现tomcat假死的情形,具体现象为 页面一直在加载,一直加载不好。我又不知道怎么看tomcat的线程情况,留个脚印,寻找方法中。

Update: 问题解决了,是更新数据库时发生了死锁,解决方法看这里

AI Assistants Do Not Make Good Code

AI Assistants Do Not Make Good CodeIntroductionAI-powered coding assistants churn out code fast, but speed isn’t everything. They lack st...… Continue reading

using pyinvoke for task automation

Published on November 25, 2024

Implementing CorrelationID In Kafka Stream

Published on October 20, 2024