后台为Oracle9i,在jsp页面上用存储过程嵌套查询,太慢,如何解决? 我的后台Oracle9i,在jsp页面上用存储过程嵌套(外存储过程得到ResultSet,给内存储过程传递参数)查询,速度无法忍受,请问各为仁兄,如何解决这个问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先优化你的sql吧~看看在sqlplus中执行效率如何其次调优网络状况然后调整应用服务器,比如增大缓存等等 try { /*调用存储过程*/ cs = dbConnection.getCallableStatement( "Scatter_Form_Account.getCenterScatterFormInfo(?,?,?,?,?,?,?)"); cs.setString(1,regionCode); cs.setString(2,agencyCode); cs.setString(3,loginEnterpriseCode); cs.setString(4,agencyWorkerCode); cs.setString(5,startTime); cs.setString(6,endTime); cs.registerOutParameter(7,OracleTypes.CURSOR); cs.executeQuery(); rs=(ResultSet)cs.getObject(7); /*调用存储过程*/ returnFeeCs = dbConnection.getCallableStatement( "Scatter_Form_Account.getReturnFee(?,?,?,?,?,?,?)"); while(rs.next()) { int tempRowNum=0; rowNum=1; returnFeeCs.setString(1,rs.getString("form_code")); returnFeeCs.registerOutParameter(2,OracleTypes.CURSOR); returnFeeCs.registerOutParameter(3,java.sql.Types.INTEGER); returnFeeCs.registerOutParameter(4,OracleTypes.CURSOR); returnFeeCs.registerOutParameter(5,java.sql.Types.INTEGER); returnFeeCs.registerOutParameter(6,OracleTypes.CURSOR); returnFeeCs.registerOutParameter(7,java.sql.Types.INTEGER); returnFeeCs.executeQuery(); tempRowNum=returnFeeCs.getInt(3); if(tempRowNum>rowNum) { rowNum=tempRowNum; } tempRowNum=returnFeeCs.getInt(5); if(tempRowNum>rowNum) { rowNum=tempRowNum; } tempRowNum=returnFeeCs.getInt(7); if(tempRowNum>rowNum) { rowNum=tempRowNum; } sightRs=(ResultSet)returnFeeCs.getObject(2); hotelRs=(ResultSet)returnFeeCs.getObject(4); restaurantRs=(ResultSet)returnFeeCs.getObject(6);%> <tr align = center bgColor=#EEEEEE height=20> <td rowspan =<%=rowNum%> width="24" > <%=++i%> </td> <td rowspan =<%=rowNum%> width="67"> <%=rs.getString("form_code")%></td> <td rowspan =<%=rowNum%> width="102"> <%=rs.getString("china_short_name")%> </td> <td rowspan =<%=rowNum%> width="56"> <%=rs.getString("Name")%></td> <%if(sightRs.next()) {%> <td><%=sightRs.getString("china_short_name")%></td> <td><%=sightRs.getDouble("diffPerseonNumber")%> </td> <td><%=sightRs.getDouble("returnFee")%> </td> <%sightReturnTotal+=sightRs.getDouble("returnFee"); } else { %> <td> </td> <td> </td> <td> </td> <% } if(hotelRs.next()) { %> <td><%=hotelRs.getString("china_short_name")%></td> <td><%=hotelRs.getDouble("returnFee")%> </td> <% hotelReturnTotal+=hotelRs.getDouble("returnFee"); } else { %> <td> </td> <td> </td> <% } if(restaurantRs.next()) { %> <td><%=restaurantRs.getString("china_short_name")%></td> <td><%=restaurantRs.getDouble("diffPerseonNumber")%> </td> <td><%=restaurantRs.getDouble("returnFee")%> </td> <% restaurantReturnTotal+=restaurantRs.getDouble("returnFee"); } else { %> <td> </td> <td> </td> <td> </td> <% } %> </tr> <% int j=1; while(j<rowNum) { if(sightRs.next()) {%> <td><%=sightRs.getString("china_short_name")%></td> <td><%=sightRs.getDouble("diffPerseonNumber")%> </td> <td><%=sightRs.getDouble("returnFee")%> </td> <%sightReturnTotal+=sightRs.getDouble("returnFee"); } else { %> <td> </td> <td> </td> <td> </td> <% } if(hotelRs.next()) { %> <td><%=hotelRs.getString("china_short_name")%></td> <td><%=hotelRs.getDouble("returnFee")%> </td> <% hotelReturnTotal+=hotelRs.getDouble("returnFee"); } else { %> <td> </td> <td> </td> <% } %> <% if(restaurantRs.next()) { %> <td><%=restaurantRs.getString("china_short_name")%></td> <td><%=restaurantRs.getDouble("diffPerseonNumber")%> </td> <td><%=restaurantRs.getDouble("returnFee")%> </td> <% restaurantReturnTotal+=restaurantRs.getDouble("returnFee"); } else { %> <td> </td> <td> </td> <td> </td> <% } %> </tr> <% j++; } if(sightRs!=null) { sightRs.close(); } if(hotelRs!=null) { hotelRs.close(); } if(restaurantRs!=null) { restaurantRs.close(); } returnFeeCs.clearParameters(); } } catch(SQLException e) { System.out.println("存储过程异常!"); e.printStackTrace(); } finally { if(rs!=null) { rs.close(); } if(sightRs!=null) { sightRs.close(); } if(hotelRs!=null) { hotelRs.close(); } if(restaurantRs!=null) { restaurantRs.close(); } if(returnFeeCs!=null) { returnFeeCs.close(); } if(cs!=null) { cs.close(); } if(dbConnection!=null) { dbConnection.close(); } }%> 1首先要看:你返回的是否有大字传,如text类型的.这样的话很消耗贷款2第一称是一个rs游标结果集,而第二层也是游标结果集.而且第二层有不少逻辑,产生慢的原因又有如下: 如果楼主采用的不是连接池,第一层要连接(建立很好资源,耗时耗力),第一层只连接一次 第二层前套在第一层,如果有30个就要循环十次,建立十个连接.其他消耗不算 楼主自己想想看,一个任务就建立30次数据库连接.肯定慢,如果时我都要疯掉.这里慢的根本原因在于没有采用数据库连接池,第二个原因可能sql语句的优化问题 项目需求解惑 如何在JSP页面在线播放视频 请问一下 JSP第一次运行出错的问题 Servlet初级问题,HelloWorldServlet报错,在线等,抢分了 请教jsp里将文本框中的数据以数组格式传递至处理页面,为何数值会变? 哪位高人帮忙看一下加密解密的过程!!!!! 使用java、jsp等相关技术如何实现报表? jsp页面中使用iframe导致连接被重置、重复执行两次的奇怪问题! 在jbuilder中,jsp 页面 调试问题? struts22.3jar升级到struts2 2.5jar 报错 求大神 大家进来看看,是一个导航的问题 jboss问题
{
/*调用存储过程*/
cs = dbConnection.getCallableStatement(
"Scatter_Form_Account.getCenterScatterFormInfo(?,?,?,?,?,?,?)");
cs.setString(1,regionCode);
cs.setString(2,agencyCode);
cs.setString(3,loginEnterpriseCode);
cs.setString(4,agencyWorkerCode);
cs.setString(5,startTime);
cs.setString(6,endTime);
cs.registerOutParameter(7,OracleTypes.CURSOR);
cs.executeQuery();
rs=(ResultSet)cs.getObject(7);
/*调用存储过程*/
returnFeeCs = dbConnection.getCallableStatement(
"Scatter_Form_Account.getReturnFee(?,?,?,?,?,?,?)");
while(rs.next())
{
int tempRowNum=0;
rowNum=1;
returnFeeCs.setString(1,rs.getString("form_code"));
returnFeeCs.registerOutParameter(2,OracleTypes.CURSOR);
returnFeeCs.registerOutParameter(3,java.sql.Types.INTEGER);
returnFeeCs.registerOutParameter(4,OracleTypes.CURSOR);
returnFeeCs.registerOutParameter(5,java.sql.Types.INTEGER);
returnFeeCs.registerOutParameter(6,OracleTypes.CURSOR);
returnFeeCs.registerOutParameter(7,java.sql.Types.INTEGER);
returnFeeCs.executeQuery();
tempRowNum=returnFeeCs.getInt(3);
if(tempRowNum>rowNum)
{
rowNum=tempRowNum;
}
tempRowNum=returnFeeCs.getInt(5);
if(tempRowNum>rowNum)
{
rowNum=tempRowNum;
}
tempRowNum=returnFeeCs.getInt(7);
if(tempRowNum>rowNum)
{
rowNum=tempRowNum;
}
sightRs=(ResultSet)returnFeeCs.getObject(2);
hotelRs=(ResultSet)returnFeeCs.getObject(4);
restaurantRs=(ResultSet)returnFeeCs.getObject(6);
%>
<tr align = center bgColor=#EEEEEE height=20>
<td rowspan =<%=rowNum%> width="24" > <%=++i%> </td>
<td rowspan =<%=rowNum%> width="67"> <%=rs.getString("form_code")%></td>
<td rowspan =<%=rowNum%> width="102"> <%=rs.getString("china_short_name")%> </td>
<td rowspan =<%=rowNum%> width="56"> <%=rs.getString("Name")%></td>
<%if(sightRs.next())
{%>
<td><%=sightRs.getString("china_short_name")%></td>
<td><%=sightRs.getDouble("diffPerseonNumber")%> </td>
<td><%=sightRs.getDouble("returnFee")%> </td>
<%sightReturnTotal+=sightRs.getDouble("returnFee");
}
else
{
%>
<td> </td>
<td> </td>
<td> </td>
<%
}
if(hotelRs.next())
{
%>
<td><%=hotelRs.getString("china_short_name")%></td>
<td><%=hotelRs.getDouble("returnFee")%> </td>
<%
hotelReturnTotal+=hotelRs.getDouble("returnFee");
}
else
{
%>
<td> </td>
<td> </td>
<%
}
if(restaurantRs.next())
{
%>
<td><%=restaurantRs.getString("china_short_name")%></td>
<td><%=restaurantRs.getDouble("diffPerseonNumber")%> </td>
<td><%=restaurantRs.getDouble("returnFee")%> </td>
<%
restaurantReturnTotal+=restaurantRs.getDouble("returnFee");
}
else
{
%>
<td> </td>
<td> </td>
<td> </td>
<%
}
%>
</tr>
<%
int j=1;
while(j<rowNum)
{
if(sightRs.next())
{%>
<td><%=sightRs.getString("china_short_name")%></td>
<td><%=sightRs.getDouble("diffPerseonNumber")%> </td>
<td><%=sightRs.getDouble("returnFee")%> </td>
<%sightReturnTotal+=sightRs.getDouble("returnFee");
}
else
{
%>
<td> </td>
<td> </td>
<td> </td>
<%
}
if(hotelRs.next())
{
%>
<td><%=hotelRs.getString("china_short_name")%></td>
<td><%=hotelRs.getDouble("returnFee")%> </td>
<%
hotelReturnTotal+=hotelRs.getDouble("returnFee");
}
else
{
%>
<td> </td>
<td> </td>
<%
}
%>
<%
if(restaurantRs.next())
{
%>
<td><%=restaurantRs.getString("china_short_name")%></td>
<td><%=restaurantRs.getDouble("diffPerseonNumber")%> </td>
<td><%=restaurantRs.getDouble("returnFee")%> </td>
<%
restaurantReturnTotal+=restaurantRs.getDouble("returnFee");
}
else
{
%>
<td> </td>
<td> </td>
<td> </td>
<%
}
%>
</tr>
<%
j++;
}
if(sightRs!=null)
{
sightRs.close();
}
if(hotelRs!=null)
{
hotelRs.close();
}
if(restaurantRs!=null)
{
restaurantRs.close();
}
returnFeeCs.clearParameters();
}
}
catch(SQLException e)
{
System.out.println("存储过程异常!");
e.printStackTrace();
}
finally
{
if(rs!=null)
{
rs.close();
}
if(sightRs!=null)
{
sightRs.close();
}
if(hotelRs!=null)
{
hotelRs.close();
}
if(restaurantRs!=null)
{
restaurantRs.close();
}
if(returnFeeCs!=null)
{
returnFeeCs.close();
}
if(cs!=null)
{
cs.close();
}
if(dbConnection!=null)
{
dbConnection.close();
}
}
%>
2第一称是一个rs游标结果集,而第二层也是游标结果集.而且第二层有不少逻辑,产生慢的原因又有如下:
如果楼主采用的不是连接池,第一层要连接(建立很好资源,耗时耗力),第一层只连接一次
第二层前套在第一层,如果有30个就要循环十次,建立十个连接.其他消耗不算
楼主自己想想看,一个任务就建立30次数据库连接.肯定慢,如果时我都要疯掉.这里慢的根本原因在于没有采用数据库连接池,第二个原因可能sql语句的优化问题