首先,建数据库表,采用MySQL数据库。
CREATE TABLE `t_jobstat` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`jobNo` varchar(45) DEFAULT NULL,
`clickSum` int(10) unsigned DEFAULT NULL,
`showSum` int(10) unsigned DEFAULT NULL,
`mailSum` int(10) unsigned DEFAULT NULL,
`locationid` varchar(10) DEFAULT NULL,
`logdate` char(8) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7320077 DEFAULT CHARSET=gbk MAX_ROWS=500000000;
其次,插入大批量数据,本次测试,插入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钟.