当前位置:编程学习 > JAVA >>

jdbc 执行查询很慢?

java  web项目,一查询语句,查询速度很慢,达到几十秒。数据量也就几百,多的话1000,2000.在PL/SQL中查询,速度很正常,零点几秒。数据库是oracle11g。各位知道是什么原因造成的吗? java jdbc pl/sql --------------------编程问答-------------------- 你代码写的有问题,ORACLE用JDBC几秒插入几万都是可以的。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 不会的,一定是代码的问题。不如楼主晒晒代码,我们帮你看看分析分析,楼主你觉得呢? --------------------编程问答--------------------
引用 5 楼 NNTT2010 的回复:
不会的,一定是代码的问题。不如楼主晒晒代码,我们帮你看看分析分析,楼主你觉得呢?


很显然楼主的代码是国家机密,不能公开的。楼主认为这里的人都应该是神,一行半的字就能解决问题了。 --------------------编程问答-------------------- 贴一下代码噜。。放在plsql里运行正常,那就说明不是语句问题了,应该是java代码有问题。。顺便也把java代码贴出来一下。我怀疑是不是connection或resultset没有调用close方法。。 --------------------编程问答-------------------- 必须是代码问题 --------------------编程问答-------------------- 代码问题++; --------------------编程问答-------------------- StringBuilder sql=new StringBuilder();
sql.append("select ws.sensor_type,vd.*");
sql.append(" from twiss_well_sensor_type ws");
sql.append(" inner join(");
    sql.append(" select d.ws_id,d.data,d.sampling_time");
sql.append(" from twisb_value_data d");
sql.append(" where d.sampling_time between ? and sysdate");
sql.append(" and d.ws_id in("+wsIds+")");
sql.append(" )vd on ws.ws_id=vd.ws_id");
sql.append(" order by vd.ws_id,vd.sampling_time");
//return baseJdbcDAONew.queryForList(sql.toString(),new Object[]{startDate},SmpDataViewObj.class);
List<SmpDataViewObj>  rst=new ArrayList<SmpDataViewObj>();
SmpDataViewObj obj=null;
Connection con=null;
PreparedStatement stat=null;
ResultSet rs=null;
try{
Date sd=new Date();
con=DataSourceUtils.getConnection(baseJdbcDAONew.getDataSource());
stat=con.prepareStatement(sql.toString());
stat.setTimestamp(1, new Timestamp(startDate.getTime()));
rs=stat.executeQuery();
Date nd=new Date();
System.out.println("*********sql cost:"+(nd.getTime()-sd.getTime()));
while(rs.next()){
obj=new SmpDataViewObj();
obj.setSensorType(rs.getString("sensor_type"));
obj.setWsId(rs.getString("ws_id"));
obj.setData(rs.getDouble("data"));
obj.setSamplingTime(new Date(rs.getTimestamp("sampling_time").getTime()));
rst.add(obj);
}
Date nd2=new Date();
System.out.println("*********java while cost:"+(nd2.getTime()-nd.getTime()));
}
catch(Exception e){
e.printStackTrace();
}

第一个打印的时间就是几十秒,第二次执行的时候几正常了,这可能是oracle已经将数据缓存了。 --------------------编程问答-------------------- finally{
try{
if(rs!=null){
rs.close();
}
if(stat!=null){
stat.close();
}
}
catch(Exception exc){
exc.printStackTrace();
}
rs=null;
stat=null;
DataSourceUtils.releaseConnection(con, baseJdbcDAONew.getDataSource());
} --------------------编程问答-------------------- 严重怀疑这一句:con=DataSourceUtils.getConnection(baseJdbcDAONew.getDataSource());

把这一句的时间另算 --------------------编程问答-------------------- 这句调试时看了,正常。瓶颈不在这个地方。主要是rs=stat.executeQuery();
这句,断点调试时,有很明显的停顿。baseJdbcDAONew 继承的SimpleJdbcDaoSupport,在spring容器中配置,注入 dataSource。DataSourceUtils 也是使用的spring里的一个工具类。问题应该不在这。
更换过jdbc的驱动,之前用的是ojdbc6,换成ojdbc5 情况一样。 --------------------编程问答-------------------- 问题基本可以确定了,感谢各位热心的富有建设意义的解答。感兴趣的可以看下这篇帖子。http://bbs.csdn.net/topics/320181076 --------------------编程问答-------------------- 晕,昨天贴的代码,在帖子管理中看到了。 --------------------编程问答-------------------- LZ,你的代码好烂。。。 --------------------编程问答-------------------- 好吧,我承认 ,我不会,看不懂 --------------------编程问答-------------------- 嗯,看来以后要多加注意这种问题,谢谢楼主分享。 --------------------编程问答-------------------- --------------------编程问答-------------------- 楼主的sql在oracle里面执行了多长时间,是不是查询语句没优化导致。
先试一下 --------------------编程问答-------------------- jdbc都慢的话,那么hibernate还能用么?
感觉楼主应该是程序本身消耗太多时间,而不是jdbc,楼主可以设几个点计算下时间 --------------------编程问答-------------------- 请问这个问题要怎么解决呢 --------------------编程问答-------------------- 看来是没用上索引。 --------------------编程问答-------------------- StringBuilder sql=new StringBuilder();
sql.append("select ws.sensor_type,vd.*");
sql.append(" from twiss_well_sensor_type ws"); 
sql.append(" inner join(");
    sql.append(" select d.ws_id,d.data,d.sampling_time");
sql.append(" from twisb_value_data d");
sql.append(" where d.sampling_time between ? and sysdate");
sql.append(" and d.ws_id in("+wsIds+")");
sql.append(" )vd on ws.ws_id=vd.ws_id");
sql.append(" order by vd.ws_id,vd.sampling_time");

是不是关联表的数据比较多嘞,优化下sql吧 --------------------编程问答-------------------- 是有点太乱了 --------------------编程问答-------------------- 肯定是代码问题。 --------------------编程问答-------------------- 代码问题,使用jdbc都这么慢,那使用hibernate那就卡死了
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,