用hibernate的性能:插入很快,可查询为什么非常慢?????
我才开始用HIBERNATE,按照它的例子测试了一下性能,有点疑问!
我用的例子就是那个最最简单的cat的例子,只有一个cat的class,再没有其他
任何相关的类:
public class Cat {
private String id;
private String name;
private char sex;
private float weight;
......//get/set
}
然后我用hibernate操作这个cat类,写了一个插入DB的方法和查询的方法:
public void createCats(){
for(int i=0;i<1000;i++){
Cat princess = new Cat();
princess.setName("Princess"+i);
princess.setSex('F');
princess.setWeight(7.4f);
session.save(princess);
}
}
另一个查询的方法:
public void selectFemaleCats(){
String queryString = "select cat from Cat as cat where cat.sex = :sex";
Query query = session.createQuery(queryString);
query.setCharacter("sex", 'F');
for (Iterator it = query.iterate(); it.hasNext();) {
Cat cat = (Cat) it.next();
}
}
然后在另外一个方法里调用这两个方法:
public void test(){
long startTime=System.currentTimeMillis();
initHibernate();
System.out.println("-------------spare time 0:"+(System.currentTimeMillis()-startTime));
// Create some Cats
beginTransaction();
createCats();
endTransaction(true);
System.out.println("-------------spare time 1:"+(System.currentTimeMillis()-startTime));
// Select all Cats
beginTransaction();
selectFemaleCats();
endTransaction(false);
System.out.println("-------------spare time 2:"+(System.currentTimeMillis()-startTime));
}
其中,beginTransaction/endTransaction这两个方法很简单:
private void beginTransaction()
throws HibernateException {
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
private void endTransaction(boolean commit)
throws HibernateException {
if (commit) {
transaction.commit();
} else {
// Don't commit the transaction, can be faster for read-only operations
transaction.rollback();
}
session.close();
}
我运行这个如此简单的程序,看了一下它的效率:
[03-8-16 20:09:34:047 CST] 1cdb7652 SystemOut O -------------spare time 0:751
[03-8-16 20:09:39:345 CST] 1cdb7652 SystemOut O -------------spare time 1:6049
[03-8-16 20:10:25:752 CST] 1cdb7652 SystemOut O -------------spare time 2:52456
这个时间是我多次刷新页面以后一个大致稳定下来的时间,也就是说,
插入1000条数据,用HIBERNATE大致用6秒左右,查询大致在50秒左右!!!!!!!!
而我改成直接使用Statement(不是PreparedStatement),
插入1000条的时间一般是13秒,比用hibernate慢了一倍,但是,
查询的速度却保持在20秒左右,比用hibernate查询要快一倍多
请问,这是为什么呢?????????