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]

Reply via email to