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: 问题解决了,是更新数据库时发生了死锁,解决方法看这里