Richard,

Richard S. Huntrods wrote:
|> Richard,
|>
|> Richard S. Huntrods wrote:
|> |    public static Vector listLookup(String table) {
|> | // Connection connection = null; // connection is managed by a
|> | connection pool
|>
|> So, is 'connection' a local or not?
| It's part of my code (I use my own connection pool class) but not to the
| DBMS code. Only if you can't get a connection from the pool
| (connection==null) do you create a local one for this method.
|
| If the connection from the pool is OK, you use it then release it back
| to the pool. If it's local (because you could not get one from the pool)
| then you close it in the finally block.

I think you are misunderstanding me: I'm asking if you are using a
shared java.sql.Connection reference among all threads running your db
code. If you are, then you've got a big problem, which could explain
some of the memory leaks you are seeing. If you have a class-level
reference like this:

public class MyDBMSMethods
{
~  private Connection connection;

~  public List getMyRecords()
~  {
~     connection = getConnectionFromPool();

~     ...
~  }
}

... then you should expect lots of problems. From your posted code, it
looks like this is what you are doing.

All connection references should be strictly local to each method. Each
method should get its own connection from the connection pool, use it,
and return it to the pool (unless you accept the connection as a
parameter to the method, in which case, you should use it).

Everything is local except the pooled connections, so I would say this is the problem. This code was originally written before tomcat had good connection pools, and so I had to write my own. The pool is basically a vector of connections.

At a more fundamental level, I still don't think the new connector is working correctly (and I've read many of the forum discussions about this...). If I close the resultset AND the statement, then the connector should release all the objects created by those two. The connection is, after all, just a pipe between the database and the java code. The connector should not (IMO) be hanging on to statement or resultset objects just because the connection is still in existance.



|> You need to have statement.close() and resultSet.close() in here (in the
|> finally block), not up above. Also, most database connection pools
|> require that you call connection.close() to return the connection to the
|> pool. Are you ever calling connection.close()?
|
| Um, sorry to disagree, but that is not really correct and also does not
| touch my problem.

Not closing your resources in a finally block it surely /not/ correct,
and you /can/ leak resources in this way. Which part of my statement is
not correct?
Yea - looked further and I have seen try/catch blocks in finally code.

Still - this is most clearly NOT my problem as I can verify my code is working "normally" (i.e. no exceptions happening) and thus properly closing both the resultset and the statement.

For fun I put try-catch blocks with additional resultset and statemtent calls to close in the finally block and it made no difference to the memory leak.


| I am already closing the resultSet and statement in the "normal
| execution" part of my code. At no time during the execution of this code
| in these tests was an exception thrown in this method

It doesn't matter. If you do not close your resources in a finally
block, they are not guaranteed to be closed. It might not be your
current problem, but it could be your future problem.
I will not disagree with this. That's why the finally is there in the first place.


| so *I was now
| correctly closing the statement and resultSet. YET IN SPITE OF THIS the
| versions of the connector after 3.1.10 FAIL to release the Field objects.
|
| The other reason NOT to put close() in the fianlly block is that the
| close() methods can throw and exception.

That's why you wrap the call to close() in its own try/catch block.

| It is very bad programming
| practice to put "exception throwing code' in a finally block. Sure, you
| could use another "try-catch" structure for the close() statements, but
| really - you should have already closed the stuff in the normal
| execution (as I did).

If you say so. My code doesn't leak DB resources, and it is written in
this way.

| I did state one thing in error - the finally block (of course) ALWAYS
| gets called, so you only want code in that block that must be done after
| all else has happened, but you also don't really want to be repeating
| code that should go elsewhere (like the close()).
|>
|>
|> Also, which connection pool do you use?
|
| My own.

Is there a compelling reason not to use one of the freely-available,
well-supported connection pools available? Tomcat even has one already
built into it.

Yea - the code was developed a long while ago. There's also a single version that can run under Tomcat or as offline processes and I don't want to have to write two different database mechanisms to support the application outside of Tomcat.

| Yea - the problem may be in the connection pool that I wrote, but I
| still find it odd that closing the resultSet() and statement() has no
| effect using connectors from 3.1.10 and on. Connector 3.0.17b and prior
| work just fine and release the objects.

If that's the case, I would stick with the Connector/J version that works.
I am for now, but I still want to resolve this so that I can keep current with the connectors. It's pretty much guaranteed at some point in the future a new version of MySQL will need the new connector in order to work. ;-)

-R


- -chris

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to