锁定老帖子 主题:Hibernate与Jdbc的效率测试
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-04
首先,建数据库表,采用MySQL数据库。 CREATE TABLE `t_jobstat` ( 其次,插入大批量数据,本次测试,插入730万条数据。
一.Jdbc测试 主要方法如下: 1.数据访问层 /** * 检索前1000条记录 * @return * @throws SQLException */ public List<Jobstat> findAll() throws SQLException { String sql = "select * from t_jobstat where locationid like '%530%' limit 0,1000 "; // 执行查询 ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); // 将查询结果组装至Asset实体对象 Jobstat jobstat = null; List<Jobstat> list = new ArrayList<Jobstat>(); while (rs.next()) { jobstat = new Jobstat(); jobstat.setId(rs.getInt("id")); jobstat.setJobNo(rs.getString("jobNo")); jobstat.setClickSum(rs.getInt("clickSum")); jobstat.setShowSum(rs.getInt("showSum")); jobstat.setMailSum(rs.getInt("mailSum")); jobstat.setLocationId(rs.getString("locationId")); jobstat.setLogdate(rs.getString("logdate")); list.add(jobstat); jobstat = null; } return list; } 2.Action层
/** * 检索前1000条记录 * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward findTop(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{ JobstatDAO dao = new JobstatDAO(); long start = System.currentTimeMillis(); List<Jobstat>list = dao.findAll(); request.setAttribute("results", list); long end = System.currentTimeMillis(); System.out.println("取出前1000条数据组装为对象,花费时间为"+(end-start)+"ms"); return mapping.findForward("top"); } 3.我们打开一个测试页面,http://localhost:8080/jdbctest/jobstat.do?p=findTop 然后将默认浏览器设为能打开多Tab页的遨游,狂点测试页,最后数据取出速度稳定在16ms左右。
二.Hibernate Test 1.DAO访问层 public static void main(String[] args) throws UnsupportedEncodingException{ session = HibernateUtil.currentSession(); // 开启连接 long start = System.currentTimeMillis(); String queryString = "from Jobstat as js"; Query queryObject = session.createQuery(queryString); int pageNo =0; pageNo = new Random().nextInt(10); queryObject.setFirstResult(1000*pageNo); queryObject.setMaxResults(1000*(pageNo+1)); List list = queryObject.list(); long end = System.currentTimeMillis(); System.out.println("随机取出前1000条数据组装为对象,花费时间为"+(end-start)+"ms"); } 2进行数据量测试,当数据库中未建主键测试中,取出1000条数据花费时间为680ms,当主键索引存在后,取出1000条数据花费时间为530ms
综上测试, Hibernate作为一个O/R Mapping,比JDBC具备的优势有: 1.编程思想上,更加符合人的逻辑思维习惯,面向对象比面向过程更加容易理解,测试和维护 2.开发维护速度上,Hibernate显著的快,代码量显著小 3.通过Annotation进行数据库的字段加密 4.对Sql不熟的菜鸟来说可以自动调优 5.结合Spring,通过声明式事务可以省略事务的控制,事务以横切面形式出现
Jdbc比Hibernate具备的优势有: 1.大数据量访问时,Jdbc的效率显著快 2.直接操作数据库比较灵活
Hibernate比Jdbc慢的地方: 1.将Hql语句转化为标准Sql语句,花费时间可以忽略不急 2.将ResultSet中数据组装为实体对象,如果即所得数据量比较大(比如一次检索1000条数据),这是效率就会降低,在组装实体对象花费时间较长
检索单表的1000条数据,Hibernate与Jdbc均不会超过1S钟.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-09-04
没什么意义的测试
jdbc也会去封装的 cache不是只有hibernate有 |
|
返回顶楼 | |
发表时间:2008-09-04
这完全要看项目要求了
|
|
返回顶楼 | |
发表时间:2008-09-04
这个貌似每隔一段时间就有人发hibernate贴证明他性能低下的
|
|
返回顶楼 | |
发表时间:2008-09-04
还在做这种测试,有何意义
|
|
返回顶楼 | |
发表时间:2008-09-04
@rainerWJY
jdbc也会去封装的 cache不是只有hibernate有 对,这位仁兄说的很对,Jdbc的封装除了手动封装之外,还可以通过其他工具类进行反射封装,目的就在与测试反射装配实体Bean的效率如何。 Cache的确其他的O/R mapping有。 @sinostone 这完全要看项目要求了 赞同,感觉数量访问不是很大的都可以使用Hibernate提高开发效率;而Jdbc则适合做数据量交互大的系统。 @laiseeme 这个貌似每隔一段时间就有人发hibernate贴证明他性能低下的 Hibernate确实相较于Jdbc有性能方面的损失,做测试的目的是明确技术的适用范围。 @lzmhehe 还在做这种测试,有何意义 请问这位仁兄如何进行技术选型? |
|
返回顶楼 | |
发表时间:2008-09-04
alfredgao 写道 @rainerWJY
jdbc也会去封装的 cache不是只有hibernate有 对,这位仁兄说的很对,Jdbc的封装除了手动封装之外,还可以通过其他工具类进行反射封装,目的就在与测试反射装配实体Bean的效率如何。 Cache的确其他的O/R mapping有。 @sinostone 这完全要看项目要求了 赞同,感觉数量访问不是很大的都可以使用Hibernate提高开发效率;而Jdbc则适合做数据量交互大的系统。 @laiseeme 这个貌似每隔一段时间就有人发hibernate贴证明他性能低下的 Hibernate确实相较于Jdbc有性能方面的损失,做测试的目的是明确技术的适用范围。 @lzmhehe 还在做这种测试,有何意义 请问这位仁兄如何进行技术选型? 最近在看cglib 目前来说这种实现必然是最快的,他等于用java的方法从新模拟了整个调用javaclass的过程,自然是想cache哪儿就cache哪儿,还能动态添加方法等,无他。这个最快。 你做orMapping 想要速度必然是cglib。cache选型就很多了。hibernate并不一定适合所有应用 |
|
返回顶楼 | |
浏览 4200 次