That's exactly the problem... we dont't have any servlets (I wish we had, but I didn't 
design, I only code)... only JSPs and classes... 
 
I'll give u an example of how are things here... let's say we have a class called 
BusinessObject, and a class called DAOBusinessObject...
 
so I'd have a JSP like that
 
<%
    BusinessObject bo = new BusinessObject(); // at this point, DAOBusinessObject 
requested a connection
    bo.method1(); // this method calls a method in DAO which runs a query
    bo.method2(); // this on too... and every other method as well...
%>
 
so, as long as the DAOBusinessObject object "lives" the Connection is there... how am 
I supposed to close it, since every query needs it? Now I see, I should have a method 
to close the used conn or something... but we have up to 50 DAO* classes and more then 
200 JSPs... 
 
I agree with what u said about the finalize()... but what should I do then?
 
 
.:| Christian J. Dechery
.:| FINEP - Depto. de Sistemas
.:| [EMAIL PROTECTED]
.:| (21) 2555-0332

>>> [EMAIL PROTECTED] 21/08/02 16:37 >>>


On Wed, 21 Aug 2002, Christian J. Dechery wrote:

> Date: Wed, 21 Aug 2002 16:13:23 -0300
> From: Christian J. Dechery <[EMAIL PROTECTED]>
> Reply-To: Tomcat Users List <[EMAIL PROTECTED]>
> To: [EMAIL PROTECTED] 
> Subject: Re: problems with Connections
>
> I don't think it is TOTALLY offtopic, since the problem occurs within
> Tomcat...

>From your description of the problem and your design approach, I'll bet it
would happen to you in a long-running non-servlet application as well.

and when I close tomcat all the connections and cursors are
> released...
>

Exactly what you'd expect if your application is leaking open connections,
statements, or result sets.

> as I said in my email I close ALL ResultSets and Statements in "finally"
> blocks...
>

Fine, I'll take your word for it ... but missing a case would easily
account for what you are seeing.  (In the particular case of Oracle, a
cursor is allocated for each result set, which is not released until the
result set is closed).

> as for "closing" the Connection... can I use the finalize() in the DAO*
> classes to use the method that returns the Connection to the pool?? Cuz
> I can't see anywhere else where I'd be able to do that...
>

The right design pattern is to acquire a connection, do whatever
processing is required, and immediately release it.  For example:

  DataSource dataSource = ...;  // Acquire reference to connection pool
  Connection conn = null;
  try {
    conn = dataSource.getConnection();
    ... perform SQL operations as necessary ...
    conn.close();     // Return connection to the pool
    conn = null;
  } catch (SQLException e) {
    ... deal with problems ...
  } finally {
    if (conn != null) {
      try {
        conn.close();  // Return to pool even if an exception occurred
      } catch (SQLException e) {
        ;
      }
      conn = null;
    }
  }

Waiting for the finalize() method to clean up just occupies resources
needlessly until the garbage collector gets around to running -- this
by itself could easily exhaust your available connections in a busy
environment.  It also assumes that your JDBC driver's implementation of
the finalize() method knows that this Connection was stored in a pool.
That seems like a really shaky bet.

A primary goal of your designs should be to minimize the amount of time
that you have a database connection allocated to the processing of a
particular request -- connections are expensive to create, and there's
always an upper limit on how many your database will support.

> .:| Christian J. Dechery
> .:| FINEP - Depto. de Sistemas
> .:| [EMAIL PROTECTED] 
> .:| (21) 2555-0332

Craig


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>



Reply via email to