如何获得ORACLE数据库游标的最大数(200分)

  • 主题发起人 主题发起人 jetcoyuan
  • 开始时间 开始时间
J

jetcoyuan

Unregistered / Unconfirmed
GUEST, unregistred user!
用JSP/SERVLET开发应用网站时,当执行SQL语句时,
提示:
出现错误 ORA-01000: 超出打开游标的最大数
后台数据库是中文ORACLE8.17,数据库连接用JAVABEAN实现,并在Finally里
statement=null;
rs.close;
rs=null;
db.disconnect;
数据库CURSOR已经增大至300,已经更新了classes12.zip,仍不行
请问:如何解决以上问题?如何在JSP程序中得到数据库目前已经使用的游标数?
 
打开方式有问题,把前面的一些语句贴出来。
 
类com.wf.db.cMdbResult
{
public com.ibm.db.SelectResult rs=null;
}
public boolean close() {
rs.close();
rs=null;
}

类com.wf.db.conpool
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import com.ibm.db.*;
import java.sql.*;
import javax.sql.*;
import com.ibm.ejs.dbm.jdbcext.*;
import javax.naming.*;

public class conpool{
private Connection conn=null;

public static DataSource ds = null;
private DatabaseConnection connBean=null;
private int MaxRowCount=0;
}
public void disconnect()
{
if (conn != null)
conn.close();
}
public boolean GetDBConnection(DataSource ds,String user,String password ) {
conn = ds.getConnection(user, password);

connBean = new DatabaseConnection(conn);
}
public boolean GetDBConnection(Connection conn1 ) {
conn=conn1;
connBean = new DatabaseConnection(conn);
}
public MdbResult QuerySQL(String strQuery)
{
try{
MdbResult mresult=new MdbResult();
SelectResult result=null;
SelectStatement sqlStatement = new SelectStatement();
sqlStatement.setConnection(connBean);
StatementMetaData metaData = sqlStatement.getMetaData();
metaData.setSQL(strQuery);
int rownum=getMaxRowCount();
if(rownum>0){
sqlStatement.setMaximumRows(rownum);
}
sqlStatement.execute();
result = sqlStatement.getResult();
mresult.rs=result;
tfmetaData=metaData;
finally{
result.close();
result=null;
sqlStatement.close();
sqlStatement=null;
}
return mresult;
}
调用例子:
public void performTask(
javax.servlet.http.HttpServletRequest req,
javax.servlet.http.HttpServletResponse res)
{
com.wf.db.conpool db = new com.wf.db.conpool();
Connection conn = null;
try
{
com.wf.db.MdbResult rs = new com.wf.db.MdbResult();
conn = ds.getConnection('aa', 'aa');
if (db.GetDBConnection(conn) == false)
{
errstr =
errstr + "Connection To Database Error:" + db.ErrorInfo + db.test + "<br>";
}
else
{
sql = "select * from dic_dept where groupname not like '%*%'";
com.wf.db.MdbResult dicDept = new com.wf.db.MdbResult();
dicDept = db.QuerySQL(sql);
finally
{
db.disconnect();
conn=null;
}
}
 
dicDept = db.QuerySQL(sql);
打开时没有游标和方式,请在QuerySQL类中定义。
 
写得详细点,好吗?谢谢
 
你的问题出在connection pool上。
首先你没有关闭statement;其次如果用connection pool,你执行db.disConnect()了,其实
这个connection并没有被关闭。所以你占用的cursor还会积存。这样,就很容易达到最大
游标数了。
 
connection pool中
db.disConnect()中connection也被关闭了
 
如何获得ORACLE数据库当前打开的游标数
 
如何获得ORACLE数据库当前打开的游标数
 
select COUNT(*) from sys.GV_$OPEN_CURSOR
 
后退
顶部