`
zq0459
  • 浏览: 33915 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

技术选型带来的困扰

阅读更多
公司接到一个ERP系统改造的项目,数据库采用原有的AS400上的DB2 5.4。数据量巨大,大约有30年的历史了,而且表之间没有关联关系。由于本人技术能力有限,所以在技术选型时感到很迷茫。迷茫的原因是一方面要考虑到系统性能问题,另一方面还要考虑开发的难易程度和系统健壮性,等等一系列问题。
我将目前比较流行的技术方案分别做了一个demo,并且以查询10万条数据为标准做性能测试。结果如下:

方案名称                第一次执行耗时 第二次执行耗时 第三次执行耗时
Struts+Jdbc                 2192ms 1315ms 1299ms
Struts+Spring(JdbcTemplate) 2335ms 1317ms 1299ms
Struts+Ibatis                 3081ms 1525ms 1458ms
Struts+Spring+ibatis         4172ms 2969ms 2938ms
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提供了这样好的交流平台,希望今后越做越好。


分享到:
评论
26 楼 Joo 2008-05-05  
fight_bird 写道
Godlikeme 写道
fight_bird 写道
涉及遗留数据库用ibatis为好

你这个用例太难得了,希望能多交流。


能不能详细说明下,什么样的情况下 涉及遗留系统用ibatis好,好处在什么地方?

遗留系统一般以数据库为核心,很多系统的数据库表设计并不符合OO设计的原则,如出于性能考虑而出现的大聚合表:用单表的若干组字段代替若干个主从表结构。

举个大聚合表的实例:一个税务系统的纳税人缴款单表,10年前基于PB设计的sybase库,一个表有230多个字段,包含纳税人信息、30多个税种交欠数据、滞纳金信息、税种退税规则设定......,用Hibernate来处理会很别扭,用ibatis就方便得多。

虽说真正符合关系数据库设计原则的表设计并不和OO映射矛盾,但对于遗留系统,在当时有很多的理由采取各种非正规的表设计方式:大聚合表、离散表、多重冗余,对于这些表,sql层面的灵活性就十分重要!


大大能不能详细说说iBatis和Hibernate在处理这种情况下有什么不一样
25 楼 robai 2008-05-05  
和什么技术实现没多大关系吧,你数据量大。然道每次操作都要操作30年的数据?
24 楼 rain2005 2008-05-05  
考虑数据库移植的话最好使用hibernate,而且hibernate性能会更好
LZ如果使用可以使用这个JdbcTemplate的话可以考虑这个,spring 2.5新加的功能,不用写rowMapper了
ParameterizedBeanPropertyRowMapper.newInstance(Owner.class)具体参考spring自带的例子
可以考虑结合使用JdbcTemplate和hibernate
23 楼 shrpcn 2008-05-05  
ibatis推荐, 迁移并不意味就有能力把老数据表,切分,OO化
22 楼 allenwang 2008-05-05  
从DB2向Oracle迁移?如果这样的话,建议数据持久化用Hibernate,统计等大数据操作可以使用PL/SQL,速度要快很多。当然,如果你非要考虑数据库的可移植性等等问题,那么PL/SQL可能并不适合你
21 楼 yuankai 2008-05-05  
Godlikeme 写道
AX400? AS400?
用10万条来做性能测试,靠谱么?是不是数据量太小了点。至少要百万往上吧。
不太明白为什么struts+hibernate会outof memory, 10万条都取出来也没多少内容。>100M?
这么点数据查询就这么慢,数据库有问题吧,或者代码逻辑有问题。

我觉得有几方面比较关键,
新的数据模型如何能够兼容旧模型又能满足业务要求。
数据如何移植,从旧数据模型映射到新数据模型中。
关键数据 数据量有多大。

我原来用Spring+hibernate也就碰到过outof memory问题,这个主要是没有分页导致的。
一次性取10W条记录不使用分页肯定会出问题的。
20 楼 dearmite 2008-05-05  
楼主那一段hibernate 的写法,是一个插件写好的,

这一段并无什么问题。

不这样写,
也是类似的写法。

Session sess = getSession();
return sess.createSql("from Employee ").list();

这个问题确实是这样,
如果你全取表。

用jdbc 就不会产生异常。
而用hibernate 就会产生异常。
但是,如果两面都不异常,

你用工具测 > 3次,
hibernate 时间又快!
你可以设一下内存max值看一看。

这个东西和hibernate 分配内存,JAVA 分配内存的机制有关。

为什么 eclipse 有的时候也会内存不足,而异常掉呢??
好象也是这么回事。

这坛子上关于JAVA虚拟机的高手,实在太多,
我就不好发表这方面的意见了。

只是我以前跟踪调试过这样的东西。
19 楼 zq0459 2008-05-05  
cp.you 写道
zq0459 写道
tedeyang 写道
zq0459 写道
如果持久化层使用Spring(JdbcTemplate),那么分页功能的实现依赖于数据库吗?也就是说目前采用的是DB2,以后要移植到ORACLE,分页功能需要改吗?

要改。JdbcTemplate、ibatis都是SqlMap框架,不是数据库无关的。

建议是使用hibernate,但从楼主写的代码来看似乎对hibernate不熟——否则也不会抛出OOM了
要是对hibernate没把握的,那还是用ibatis+spring吧,对200张表的开发规模是合适的。

请教为什么会抛出OOM异常呢?怎样使用Hibernate的这个查询功能更合理?


lz能确定数据库里面的数据只有10万条吗?

我看到你在jdbc方式下设置了条件查询.
引用
String sql = "select * from employee where id<?;

而在hibernate方式下则直接使用这样的hql.
引用
from employee



1.数据库中是10万条记录。
2.使用spring(jdbcTemplate)时,为了测试查询不同的数据量而添加的条件。

18 楼 bluecrystal 2008-05-05  
我认为数据库迁移很重要,迁移后的新的数据库的设计或许才是你考虑很多问题的依据
17 楼 cp.you 2008-05-05  
zq0459 写道
tedeyang 写道
zq0459 写道
如果持久化层使用Spring(JdbcTemplate),那么分页功能的实现依赖于数据库吗?也就是说目前采用的是DB2,以后要移植到ORACLE,分页功能需要改吗?

要改。JdbcTemplate、ibatis都是SqlMap框架,不是数据库无关的。

建议是使用hibernate,但从楼主写的代码来看似乎对hibernate不熟——否则也不会抛出OOM了
要是对hibernate没把握的,那还是用ibatis+spring吧,对200张表的开发规模是合适的。

请教为什么会抛出OOM异常呢?怎样使用Hibernate的这个查询功能更合理?


lz能确定数据库里面的数据只有10万条吗?

我看到你在jdbc方式下设置了条件查询.
引用
String sql = "select * from employee where id<?;

而在hibernate方式下则直接使用这样的hql.
引用
from employee

16 楼 zq0459 2008-05-05  
tedeyang 写道
zq0459 写道
如果持久化层使用Spring(JdbcTemplate),那么分页功能的实现依赖于数据库吗?也就是说目前采用的是DB2,以后要移植到ORACLE,分页功能需要改吗?

要改。JdbcTemplate、ibatis都是SqlMap框架,不是数据库无关的。

建议是使用hibernate,但从楼主写的代码来看似乎对hibernate不熟——否则也不会抛出OOM了
要是对hibernate没把握的,那还是用ibatis+spring吧,对200张表的开发规模是合适的。

15 楼 zq0459 2008-05-05  
tedeyang 写道
zq0459 写道
如果持久化层使用Spring(JdbcTemplate),那么分页功能的实现依赖于数据库吗?也就是说目前采用的是DB2,以后要移植到ORACLE,分页功能需要改吗?

要改。JdbcTemplate、ibatis都是SqlMap框架,不是数据库无关的。

建议是使用hibernate,但从楼主写的代码来看似乎对hibernate不熟——否则也不会抛出OOM了
要是对hibernate没把握的,那还是用ibatis+spring吧,对200张表的开发规模是合适的。

请教为什么会抛出OOM异常呢?怎样使用Hibernate的这个查询功能更合理?
14 楼 tedeyang 2008-05-05  
zq0459 写道
如果持久化层使用Spring(JdbcTemplate),那么分页功能的实现依赖于数据库吗?也就是说目前采用的是DB2,以后要移植到ORACLE,分页功能需要改吗?

要改。JdbcTemplate、ibatis都是SqlMap框架,不是数据库无关的。

建议是使用hibernate,但从楼主写的代码来看似乎对hibernate不熟——否则也不会抛出OOM了
要是对hibernate没把握的,那还是用ibatis+spring吧,对200张表的开发规模是合适的。
13 楼 javachs 2008-05-05  
30年的数据库估计是日本人的
12 楼 zq0459 2008-05-05  
ztka 写道
你先考虑数据库迁移,再考虑什么技术框架,数据库迁移就是一个浩大的工程。你的技术框架是建立在DB之上的。

数据库移植是本系统中的关键环节,目前正在由其他同事在做,我目前的工作重点是依据现有的数据模型选择合适的持久化技术。
11 楼 ztka 2008-05-05  
zq0459 写道
ztka 写道
你先考虑数据库迁移,再考虑什么技术框架,数据库迁移就是一个浩大的工程。你的技术框架是建立在DB之上的。


数据库移植是本系统存在的最大问题。目前这部分工作由其他同事来做,我目前的工作重点是依据现有的数据模型来对持久化技术选型。


但是你迁移不做好,很难选型,就像楼上有个朋友说的,你可以用ibates,也可以用hibernate,但是前提是在db层的设计方面,不同的框架,所对于的数据结构和模型也不同。
10 楼 zq0459 2008-05-05  
ztka 写道
你先考虑数据库迁移,再考虑什么技术框架,数据库迁移就是一个浩大的工程。你的技术框架是建立在DB之上的。


数据库移植是本系统存在的最大问题。目前这部分工作由其他同事来做,我目前的工作重点是依据现有的数据模型来对持久化技术选型。
9 楼 ztka 2008-05-05  
你先考虑数据库迁移,再考虑什么技术框架,数据库迁移就是一个浩大的工程。你的技术框架是建立在DB之上的。
8 楼 zq0459 2008-05-05  
如果持久化层使用Spring(JdbcTemplate),那么分页功能的实现依赖于数据库吗?也就是说目前采用的是DB2,以后要移植到ORACLE,分页功能需要改吗?
7 楼 zq0459 2008-05-05  
1.原有系统大约有200多张表,冗余表很多。在抽象数据模型时,我在考虑一部分采用原有的数据模型,另一部分将根据业务需要自己创建数据模型。
2.使用struts+hiberntate查询时,将返回值装配到List中抛出Java.lang.OutOfMemoryError: Java heap space。(测试数据库postgreSQL8)
查询代码如下:
public List<Employee> selectAllEmployee() {
// TODO Auto-generated method stub
Session session = null;
List<Employee> list = new ArrayList<Employee>();
try {
session = HibernateUtil.currentSession();
Query query = session.createQuery("from Employee ");
list = (List<Employee>) query.list();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("<<-------------" + e.toString());
}

return list;
}

相关推荐

    中小型制造企业信息化解决方案

    随着政府大力推进中小型企业上网工程,越来越多的企业正面临企业信息化方向发展及技术选型的困扰,而对于种类繁多的方案、建议,使得企业决策人在信息化建设方案的选择上无从下手。Internet的普及,已使得企业信息化...

    自动化产品选型-汇川伺服选型软件应用

    这款软件不仅提供全面的选型指导,还避免了查阅大量手册可能带来的困扰和不准确性。 首先,打开“汇川技术”官方网站,通过“工业自动化”分类下的“伺服”入口,用户可以轻松找到产品选型工具。这个工具包括了多种...

    论对当前智能建筑发展中的一些认识和看法.docx

    此外,智能建筑的设计和实施过程中,由于建设单位对智能建筑的复杂性和技术要求理解不全面,往往导致弱电系统的设计、采购、施工和管理出现问题,给后期运营带来困扰。 电气技术在智能建筑中扮演着至关重要的角色。...

    关于连锁企业信息化建设的思考.pdf

    例如,自动补货系统虽好,但若基础管理不到位,库存准确性不足,强行实施只会带来困扰。 再者,信息管理需要勇于面对挑战和失败。信息系统的稳定性至关重要,但为了追求完善,企业不能因害怕短暂的不稳定而停止改革...

    某医院预约挂号管理系统的毕业设计.doc

    在技术选型上,本系统采用了J2EE框架进行开发,这是一套成熟的、面向企业级应用的Java开发平台,具备良好的可扩展性和安全性。数据库方面选择了MySQL,作为开源、免费的关系型数据库管理系统,其高效稳定且易于维护...

    腾讯云微服务架构体系TSF介绍.docx

    腾讯云微服务架构体系TSF采用了如下策略和技术选型: 1. **在线协同**:通过Swagger UI进行在线接口定义,确保跨团队协作的顺畅,避免因接口变更带来的困扰。 2. **部署原则**:利用Docker进行服务打包和自动化部署...

    《飞算全自动软件工程平台建设与实战经验.pdf》

    它可能提供了一个统一的平台,使得前端、后端、数据库设计、测试等各环节能够更加协同地工作,减少了因技术选型和变更带来的困扰。 最后,该平台的愿景可能是通过结合管理制度和管理工具,实现真正的“人+制度”的...

    网页设计与开发项目设计

    良好的文档应包括项目概述、技术选型原因、功能描述、代码结构、API接口说明以及部署和维护指南等。这不仅有助于团队间的协作,也有利于未来项目的维护和升级。 总的来说,这个"网页设计与开发项目设计"涵盖了从...

    公交查询系统设计与实现论文

    总的来说,这篇论文详细探讨了公交查询系统的各个关键要素,从需求分析到系统实现,再到技术选型,全面展示了构建此类系统的过程。通过这样的系统,可以有效提升城市公共交通的服务质量和效率,降低市民出行的困扰。

    失物招领本科毕业设计答辩ppt

    随着校园规模的扩大和学生人数的增长,即使在疫情环境下,校园内的物品丢失率也持续上升,给师生带来了一定的经济损失和精神困扰。因此,设计并实施一个基于微信小程序的失物招领平台显得尤为必要。该平台不仅能帮助...

    通信各种专用词汇缩写查询软件

    在通信领域,专业术语和缩写词的使用十分广泛,这常常给初学者或非专业人士带来困扰。"通信各种专用词汇缩写查询软件"正是为解决这一问题而设计的工具,它无需安装,用户可以方便地查询通信领域的各种词汇及其缩写。...

    述职报告合集9篇.docx

    这两点在IT行业中同样适用,无论是软件开发项目还是技术团队管理,都需要团队协作来完成复杂的任务,同时,优化资源分配,比如合理安排开发人员、测试人员的角色,或者在技术选型上考虑成本效益,都是提高项目成功...

    AGV的特点及适用场景.docx

    市场需求的快速增长使得AGV市场日益繁荣,但也带来了产品选型的困扰。企业在选择AGV时,需要充分了解自身需求,参考AGV选型手册,确保选购到最适合自身生产流程的AGV型号,以最大化投资回报。 总的来说,AGV凭借其...

    基于移动终端的智能裁缝系统的设计.pdf

    尽管文章主要讨论了智能裁缝系统的开发设计,但其提及的移动终端应用开发和服务器技术对于理解现代互联网应用的构建和技术选型也具有一定的参考意义。结合移动设备的便携性和智能分析能力,这样的系统有望在未来的...

    高低压成套开关设备智能化控制系统的设计与运用分析 (2).pdf

    综上所述,高低压成套开关设备的智能化控制系统设计需综合考虑测温技术的选型与优化,同时推动国内企业提升自主研发能力,改进绝缘材料性能,以促进我国电力行业向更高效、更安全的方向发展。而随着科技的不断进步,...

    医院信息系统集成平台建设与体会.docx

    综上所述,医院信息系统集成平台的建设是一项系统工程,它不仅涉及技术选型和架构设计,还涵盖了标准制定、风险管理等多个层面。通过有效的集成,医院可以提升服务质量,优化内部管理,为科研、管理和未来发展提供强...

    毕业设计-失物招领系统

    《失物招领系统设计与实现》 失物招领系统是一种常见的信息管理平台,它旨在帮助人们在丢失物品或找到他人遗失的...通过合理的技术选型和细致的规划,我们可以构建出高效、实用的失物招领平台,为日常生活带来便利。

    基于微信小程序的医院挂号小程序设计与实现论文.docx

    1. **技术选型**: - **前端技术**:采用微信小程序框架进行开发,支持跨平台运行。 - **后端技术**:采用B/S架构,使用Node.js作为服务器端语言,配合MySQL数据库存储数据。 2. **功能模块**: - **用户注册登录...

    离线编程技术在机器人点焊项目中的应用.doc

    离线编程技术在机器人点焊项目中的应用是一个关键的技术手段,它极大地提高了焊接机器人的工作效率和灵活性。...这种技术的成熟和发展,无疑为现代汽车制造中的自动化焊接工艺带来了革命性的改变。

Global site tag (gtag.js) - Google Analytics