技术选型带来的困扰
公司接到一个ERP系统改造的项目,数据库采用原有的AS400上的DB2 5.4。数据量巨大,大约有30年的历史了,而且表之间没有关联关系。由于本人技术能力有限,所以在技术选型时感到很迷茫。迷茫的原因是一方面要考虑到系统性能问题,另一方面还要考虑开发的难易程度和系统健壮性,等等一系列问题。
我将目前比较流行的技术方案分别做了一个demo,并且以查询10万条数据为标准做性能测试。结果如下:
方案名称 第一次执行耗时第二次执行耗时第三次执行耗时
Struts+Jdbc 2192ms1315ms1299ms
Struts+Spring(JdbcTemplate)2335ms1317ms1299ms
Struts+Ibatis 3081ms1525ms1458ms
Struts+Spring+ibatis 4172ms2969ms2938ms
Struts+Hibernate Java.lang.OutOfMemoryError: Java heap space
测试方法是在Action中调用DAO中的方法,在调用方法前和返回数据后,打印当前时间来计算查询所耗费的时间。
开始的时候想采用Struts+Spring+ibatis这个方案,但是通过测试后,发现这个方案的耗时要比采用Struts+Spring(JdbcTemplate)高出将近2秒。Struts+Spring(JdbcTemplate)在性能上占有一定的优势,可是在编写代码上总是给人一种不太舒服的感觉,代码如下:
public List<Employee> getEmployeeList() {
// TODO Auto-generated method stub
String sql = "select * from employee where id<?;";
return jdbcTemplate.query(sql, new Object[]{100000}, new RowMapper(){
public Object mapRow(ResultSet rs,int index)throws SQLException{
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setDempId(rs.getInt("emp_id"));
employee.setEmpId(rs.getInt("dept_id"));
employee.setFirstName(rs.getString("first_name"));
employee.setLastName(rs.getString("last_name"));
employee.setJobCat(rs.getString("job_cat"));
employee.setSalary(rs.getInt("salary"));
return employee;
}
});
}
可能一直使用Hibernate的原因吧,总感觉这段代码不太舒服。而且Spring(JdbcTemplate)没有提供分页功能,实现起来比较麻烦。
希望各位高手能给在下一些建议?谢谢先!
2008/05/07补充:
由于昨天没机会看帖子,今天刚回来就看到这篇帖子已经出现在了首页。
激动之余发表两点感谢:
1.狂谢热心参与本次讨论的各位朋友们,小弟将会把最终的项目案例与大家分享,希望能为中国软件事业的崛起贡献微薄之力。
2.感谢javaeye提供了这样好的交流平台,希望今后越做越好。
}
return list;
}
1.内存溢出,先看JVM是不是设得太小了,建议256-1500MB,Hibernate一级缓存放不下了。
2.10万条数据全取的hibernate不是这么写的,如果楼主对Hibernate再花点时间看看书,夏昕的《深入浅出Hibernate》推荐,如果要上JDK1.5,再看一本Hibernate实战第2版(翻译得不太好,入门的人不要看)。
10万条数据你需要一次性取出么?设计需求就有问题吧,应该加分页条件的吧,不加分页条件有什么实际价值?
如果一定要取出,一定要给出需求,我给你方案。
3.Hibernate对SQL的支持我认为比iBatis好,还是看你Hibernate功力如何,ORM善加利用,开发效率和执行效率都是超过其他方案的,存储过程不算,存储过程要单独讨论的。如果是10万条记录的库以上这些框架根本不是问题,又不是100亿条数据。}
return list;
}
你的 Employee是怎么定义的?贴出相关的 annotation 和 hbm.xml 看看
也许是 Employee关联了许多其他类,但没有lazy读取