在Web环境下SQL Server存储过程返回结果集如果需要滚动就出错:Error setting up static cursor cache。而在普通应用中中正常

AYellow 2002-10-16 09:47:28
奇观的是在普通Java程序中正常,而在JSP页面中就出错
驱动程序是MS的,服务器为Tomcat4.03

代码片断如下:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dps;SelectMethod=cursor";
Connection con = DriverManager.getConnection(url,"sa","");
CallableStatement cs = con.prepareCall("{call p_dps_get_sell_by_path(?)}"
,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
/*
如果写成CallableStatement cs = con.prepareCall("{call p_dps_get_sell_by_path(?)}");就正常
*/
cs.setString(1,"admin@0001,admin@0002");
ResultSet rs = cs.executeQuery();//这里出错
while(rs.next()){
System.out.println(rs.getString(1));
}
con.close();


调用堆栈:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error setting up static cursor cache.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseImplStaticCursorResultSet.setupTempFiles(Unknown Source)
at com.microsoft.jdbc.base.BaseImplStaticCursorResultSet.postSetupInitialize(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.commonGetNextResultSet(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.executeQueryInternal(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.executeQuery(Unknown Source)
at org.apache.jsp.test$jsp.a(test$jsp.java:22)
at org.apache.jsp.test$jsp._jspService(test$jsp.java:79)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2343)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1012)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1107)
at java.lang.Thread.run(Unknown Source)
...全文
89 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qxjavajava 2002-10-17
  • 打赏
  • 举报
回复
关于数据库结果集是否可滚动的判定
TYPE_FORWARD_ONLY 这种类型的结果集只支持向前滚动
TYPE_SCROLL_INSENSITIVE 这种类型的结果集支持双向滚动
TYPE_SCROLL_SENSITIVE 这种类型的结果集,在结果集得到后,对数据所作的修改很敏感。例如:如果查询返回10行数据,而若另一个应用程序删除了其中的2行,那么,这个结果集中就只有8行数据了。

应当确定jdbc驱动程序是否支持这些特征:

public void testScrollable() throws SQLException
{
boolean supports;
DatabaseMetaData md = connection.getMetaData();

supports = md.supportsResultSetType(ResultSet.TYPE_FORWORD_ONLY);
if(supports)
{
System.out.println("TYPE_FORWORD_ONLY - Supports");
}
else
{
System.out.println("TYPE_FORWORD_ONLY - Does not support");
}

supports = md.supportsResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE);
if(supports)
{
System.out.println("TYPE_SCROLL_INSENSITIVE - Supports");
}
else
{
System.out.println("TYPE_SCROLL_INSENSITIVE - Does not support");
}

supports = md.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE);
if(supports)
{
System.out.println("TYPE_SCROLL_SENSITIVE - Supports");
}
else
{
System.out.println("TYPE_SCROLL_SENSITIVE - Does not support");
}
}


wjmmml 2002-10-16
  • 打赏
  • 举报
回复
好象和游标缓存有关系,侃侃你tomcat的配置。
hexiaofeng 2002-10-16
  • 打赏
  • 举报
回复
sorry,说错了
hexiaofeng 2002-10-16
  • 打赏
  • 举报
回复
看来是你配置的不对
luerdong 2002-10-16
  • 打赏
  • 举报
回复
换个JDBC驱动看看呢?
yangtian 2002-10-16
  • 打赏
  • 举报
回复
帮你关注一下!!
AYellow 2002-10-16
  • 打赏
  • 举报
回复
在Server.xml中有以下一段,不过我上面的代码是直接连接的,不是通过JNDI。
除此之外再也没有什么特别的地方了
<Context debug="0" docBase="fx" path="/fx" >
<Resource name="DataSource" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="DataSource">
<parameter>
<name>user</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<parameter>
<name>driverName</name>
<value>jdbc:microsoft:sqlserver://liuaj:1433;DatabaseName=dps;SelectMethod=cursor</value>
</parameter>
</ResourceParams>
</Context>

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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