直接执行SQL和在JAVA程序里执行SQL区别在哪?

山城忙碌人 2011-02-10 05:00:58
如题:
数据库:sqlserver 2000 所有条件都创建索引。
我有一sql语句如下:
select top 5000 列1,列2,列3,列4,列5from table where 条件1 = ? and 条件2=?(条件个数不固定,最少一个,最多五个)
直接在查询分析器里执行:执行时间最多就3秒左右。

用hibernate执行最少10秒以上(jdbc更慢),请问是什么原因,有什么解决办法没

程序如下:
long start = System.currentTimeMillis();
List<Object[]> smList = session.createSQLQuery(querySql).list();
long end = System.currentTimeMillis();
log.info("查询时间:"+(end-start));
就这样也得上10秒.
...全文
320 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
幽饮烛 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bisubisu 的回复:]
光查询JDBC是要快一点我试了。
但我查询出来后还要给变量赋值,加上这过程JDBC就比HIBERNATE慢了。我试验多次了,但都没人相信。
我查的数据很多1.5W都有,可能是其它原因造成的。
[/Quote]
HIBERNATE 用反射赋值,能比直接赋值快???
加载中的缓存 2011-02-12
  • 打赏
  • 举报
回复
JDBC比Hibernate慢?
山城忙碌人 2011-02-12
  • 打赏
  • 举报
回复
光查询JDBC是要快一点我试了。
但我查询出来后还要给变量赋值,加上这过程JDBC就比HIBERNATE慢了。我试验多次了,但都没人相信。
我查的数据很多1.5W都有,可能是其它原因造成的。
O溺水的鱼0 2011-02-12
  • 打赏
  • 举报
回复
1.jdbc肯定比hibernate快,因为hibernate的查询是对jdbc的封装
2.你真的一次要查出这么多数据吗?是不是有大字段?尽量缩小的你的sql结果,因为取的数据太大,返回结果集比较大,这样也可能会慢,尽量缩小数据,我试过别的数据,jdbc比hibernate要快。
sebatinsky 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 inhibitory 的回复:]
直接执行,在终端里把查到的数据输出,这个不会花很多时间,尤其是Linux,Mac下终端输出的速度非常快,Windows下会慢一些。

在Hibernate里慢,是因为查到5000条记录,要使用反射生成5000个对象,当然会慢很多。
JDBC更慢?是不是你哪里出错了?或者你是指查询到后再输出一次计算的时间?
JDBC理论上只会比Hibernate快的。

更好的办法就是把5000变成如1……
[/Quote]
大家共同一致的认为,JDBC绝对不可能比用hibernate更慢,你直接执行,是直接操作数据库,当然快,你用JDBC,有一道封装,会慢一点,用hibernate肯定还要慢一点,因为它又要进行一些相关处理,其实它也是用JDBC。只是参差不同罢了。
幽饮烛 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bisubisu 的回复:]
提个问题回复的人还真少。
[/Quote]
看到 用hibernate执行最少10秒以上(jdbc更慢) 就不想回复了。
山城忙碌人 2011-02-12
  • 打赏
  • 举报
回复
提个问题回复的人还真少。
山城忙碌人 2011-02-10
  • 打赏
  • 举报
回复
iambic
显示全部
山城忙碌人 2011-02-10
  • 打赏
  • 举报
回复
Inhibitory
第一个问题:
JDBC更慢?是不是你哪里出错了?
long startTime = System.currentTimeMillis();
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
long endTime = System.currentTimeMillis();
System.out.println("jdbc查询时间:"+(endTime-startTime));

sql:
select top 15000 xxxx from table where 条件1 = '上海' order by 列1 desc
第二个问题:
5000变成如100,这个改变不了。最多时候需要取1.5w,

现在运行真的很慢有时候要50秒左右,如果真的要把5000变为100(10也行),我除了用计时器去取1.5W数据外,我想不到别的办法。
iambic 2011-02-10
  • 打赏
  • 举报
回复
sqlserver查询分析器里真的一下子把全部5000条结果都显示给你了吗?还是只显示了5000条里的第一页(比如100条)?
想喝咖啡的貓 2011-02-10
  • 打赏
  • 举报
回复
jdbc比hibernate慢,一般是你的sql有问题。
Inhibitory 2011-02-10
  • 打赏
  • 举报
回复
直接执行,在终端里把查到的数据输出,这个不会花很多时间,尤其是Linux,Mac下终端输出的速度非常快,Windows下会慢一些。

在Hibernate里慢,是因为查到5000条记录,要使用反射生成5000个对象,当然会慢很多。
JDBC更慢?是不是你哪里出错了?或者你是指查询到后再输出一次计算的时间?
JDBC理论上只会比Hibernate快的。

更好的办法就是把5000变成如100,因为你真的需要一次取出5000条记录吗?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧