This is a JAWS/Minerva problem in JBoss2.0-Final, this is not user 
code.  The problem is that Minerva always caches PreparedStatements to 
no limit which leaves cursors open.  Since JAWS uses prepared 
statements, then you can run into maximum open cursors in your DB.

Bill

Filip Hanik wrote:

> you should always close result sets and statements.
> even if they are prepared or callable.
> 
> the underlaying driver will make the caching, if it is necessary
> 
> Filip
> 
> ~
> Namaste - I bow to the divine in you
> ~
> Filip Hanik
> Software Architect
> [EMAIL PROTECTED]
> www.filip.net 
> 
>> -----Original Message-----
>> From: [EMAIL PROTECTED]
>> [mailto:[EMAIL PROTECTED]]On Behalf Of Bill Burke
>> Sent: Wednesday, March 07, 2001 12:55 PM
>> To: JBoss-User; jbosscmp
>> Subject: [jBoss-User] maximum open cursors problemed solved
>> 
>> 
>> Thanks to all who helped, I finally solved the problem I was having with 
>> maximum open cursors in Oracle wiht JBoss/JAWS 2.0-Final.  Aaron Mulder 
>> suggested removing PreparedStatement caching, and that's what I did.
>> 
>> To verify that cursors are being closed properly use this SQL that 
>> somebody on the mailing list suggested:
>> 
>>  select SQL_TEXT,count(*),USER_NAME from
>>    V$OPEN_CURSOR group by SQL_TEXT,USER_NAME
>>     order by count(*);
>> 
>> 
>> For future reference, you need to change these classes(If I've done 
>> anything wrong, please tell me):
>> org.jboss.minerva.jdbc.ConnectionInPool
>> org.jboss.minerva.jdbc.PreparedStatementInPool
>> org.jboss.minerva.xa.XAClientConnection
>> 
>> 
>> For ConnectionInPool and XAClientConnection comment out cacheing code in 
>> statementClosed:
>>    public void statementClosed(Statement st) {
>>        statements.remove(st);
>>    /* Don't cache because we can easily reach max open cursors
>>        if ((con != null) && (st instanceof PreparedStatementInPool)) {
>>            // Now return the "real" statement to the pool
>>            PreparedStatementInPool ps = (PreparedStatementInPool) st;
>>            PreparedStatement ups = ps.getUnderlyingPreparedStatement();
>>            int rsType = ResultSet.TYPE_FORWARD_ONLY;
>>            int rsConcur = ResultSet.CONCUR_READ_ONLY;
>> 
>>            // We may have JDBC 1.0 driver
>>            try {
>>                rsType = ups.getResultSetType();
>>                rsConcur = ups.getResultSetConcurrency();
>>            } catch (Throwable th) {
>>            }
>>            PreparedStatementInPool.preparedStatementCache.put(
>>                    new PSCacheKey(con, ps.getSql(), rsType, 
>> rsConcur), ups);
>>        }
>>    */
>>    }
>> 
>> 
>> In PreparedStatementInPool you must close the actuall PreparedStatement:
>> 
>>    public void close() throws SQLException {
>>    if (impl != null) {
>>        impl.close();
>>    }
>>        con.statementClosed(this);
>>        super.clearFields();
>>        con = null;
>>        impl = null;
>>        sql = null;
>>    }
>> 
>> 
>> 
>> 
>> --
>> --------------------------------------------------------------
>> To subscribe:        [EMAIL PROTECTED]
>> To unsubscribe:      [EMAIL PROTECTED]
>> 
>> 
> 
> 
> --
> --------------------------------------------------------------
> To subscribe:        [EMAIL PROTECTED]
> To unsubscribe:      [EMAIL PROTECTED]
> 
> 
> 
> 




--
--------------------------------------------------------------
To subscribe:        [EMAIL PROTECTED]
To unsubscribe:      [EMAIL PROTECTED]

Reply via email to