sylvain     02/04/03 04:22:11

  Modified:    src/scratchpad/src/org/apache/cocoon/components/source
                        BlobSource.java
  Log:
  Ensure JDBC connection is closed a the end of read, even if the stream isn't closed. 
Cocoon most often "forgets" to close streams, causing a rapid connection pool 
overflow...
  
  Revision  Changes    Path
  1.2       +53 -9     
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/BlobSource.java
  
  Index: BlobSource.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/BlobSource.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BlobSource.java   15 Mar 2002 18:49:32 -0000      1.1
  +++ BlobSource.java   3 Apr 2002 12:22:11 -0000       1.2
  @@ -88,7 +88,7 @@
    * from people where userid='foo'</code>" in the datasource "<code>personel</code>"
    * 
    * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  - * @version $Id: BlobSource.java,v 1.1 2002/03/15 18:49:32 sylvain Exp $
  + * @version $Id: BlobSource.java,v 1.2 2002/04/03 12:22:11 sylvain Exp $
    */
   
   public class BlobSource extends AbstractStreamSource {
  @@ -281,23 +281,67 @@
           
           Connection cnx;
           
  -        public JDBCInputStream(InputStream stream, Connection cnx) {
  -            super(stream);
  -            this.cnx = cnx;
  -        }
  -        
  -        public void close() throws IOException {
  -            super.close();
  +        private final void closeCnx() throws IOException {
               if (this.cnx != null) {
                   try {
  -                    cnx.close();
  +                    Connection tmp = cnx;
                       cnx = null;
  +                    tmp.close();
                   } catch(Exception e) {
                       String msg = "Error closing the connection for " + 
BlobSource.this.systemId;
                       BlobSource.this.getLogger().error(msg, e);
                       throw new IOException(msg + " : " + e.getMessage());
                   }
               }
  +        }
  +        
  +        public JDBCInputStream(InputStream stream, Connection cnx) {
  +            super(stream);
  +            this.cnx = cnx;
  +        }
  +
  +        public int read() throws IOException {
  +            try {
  +                int result = in.read();
  +                if (result == -1) {
  +                    closeCnx();
  +                }
  +                return result;
  +            } catch(IOException e) {
  +                closeCnx();
  +                throw e;
  +            }
  +        }        
  +        
  +        public int read(byte[] b) throws IOException {
  +            try {
  +                int result = in.read(b);
  +                if (result == -1) {
  +                    closeCnx();
  +                }
  +                return result;
  +            } catch(IOException e) {
  +                closeCnx();
  +                throw e;
  +            }
  +        }        
  +        
  +        public int read(byte[] b, int off, int len) throws IOException {
  +            try {
  +                int result = in.read(b, off, len);
  +                if (result == -1) {
  +                    closeCnx();
  +                }
  +                return result;
  +            } catch(IOException e) {
  +                closeCnx();
  +                throw e;
  +            }
  +        }        
  +        
  +        public void close() throws IOException {
  +            super.close();
  +            closeCnx();
           }
       }
   }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to