You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Edoardo Panfili <ed...@aspix.it> on 2009/02/22 11:25:42 UTC
How to close open connections after application stop?
Hy,
I have one webapp in Tomcat 6.0.18 with this context:
<Context path="/myApp" docBase="myApp" debug="100" reloadable="true">
<Resource name="jdbc/myApp" auth="Container"
type="javax.sql.DataSource"
maxActive="8" maxIdle="5" maxWait="300"
username="myApp" password="passwd"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://127.0.0.1:5432/myApp"
removeAbandoned="true"
removeAbandonedTimeout="30"
logAbandoned="true"
/>
</Context>
After application stop (using tomcat manager) I'd like to (drastic
example) rename the db, but I can't do it because there are open
connections.
There are no other application using myApp db, but with "ps ax" I can see:
189 ?? Ss 0:02.67 postgres: myApp myApp 127.0.0.1(49162) idle
Is there a way to close the connection without closing Toncat?
thank you
Edoardo
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Edoardo Panfili <ed...@aspix.it>.
Edoardo Panfili ha scritto:
> Mark Thomas ha scritto:
>> Edoardo Panfili wrote:
>>> Hy,
>>>
>>> I have one webapp in Tomcat 6.0.18 with this context:
>>>
>>> <Context path="/myApp" docBase="myApp" debug="100" reloadable="true">
>>> <Resource name="jdbc/myApp" auth="Container"
>>> type="javax.sql.DataSource"
>>> maxActive="8" maxIdle="5" maxWait="300"
>>> username="myApp" password="passwd"
>>> driverClassName="org.postgresql.Driver"
>>> url="jdbc:postgresql://127.0.0.1:5432/myApp"
>>> removeAbandoned="true"
>>> removeAbandonedTimeout="30"
>>> logAbandoned="true"
>>> />
>>> </Context>
>>>
>>> After application stop (using tomcat manager) I'd like to (drastic
>>> example) rename the db, but I can't do it because there are open
>>> connections.
>>>
>>> There are no other application using myApp db, but with "ps ax" I can
>>> see:
>>>
>>> 189 ?? Ss 0:02.67 postgres: myApp myApp 127.0.0.1(49162) idle
>>>
>>> Is there a way to close the connection without closing Toncat?
>>
>> Hmm. If you were managing your own pool then you could call close() on
>> the pool.
>>
>> Arguably, if Tomcat creates an context level pool, Tomcat should close
>> it when the context stops but I don't think it does. That probably calls
>> for some testing to check behaviour and possibly an enhancement request.
> this is my code to retrieve a connection
this is the right one (not so different)
ambiente = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource) ambiente.lookup("jdbc/myApp);
Connection conn = pool.getConnection();
......
conn.close(); // this in inside finally
sorry for the wrong post
Edoardo
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Mark Thomas <ma...@apache.org>.
Edoardo Panfili wrote:
> Mark Thomas ha scritto:
>> Edoardo Panfili wrote:
>>> Hy,
>>>
>>> I have one webapp in Tomcat 6.0.18 with this context:
>>>
>>> <Context path="/myApp" docBase="myApp" debug="100" reloadable="true">
>>> <Resource name="jdbc/myApp" auth="Container"
>>> type="javax.sql.DataSource"
>>> maxActive="8" maxIdle="5" maxWait="300"
>>> username="myApp" password="passwd"
>>> driverClassName="org.postgresql.Driver"
>>> url="jdbc:postgresql://127.0.0.1:5432/myApp"
>>> removeAbandoned="true"
>>> removeAbandonedTimeout="30"
>>> logAbandoned="true"
>>> />
>>> </Context>
>>>
>>> After application stop (using tomcat manager) I'd like to (drastic
>>> example) rename the db, but I can't do it because there are open
>>> connections.
>>>
>>> There are no other application using myApp db, but with "ps ax" I can
>>> see:
>>>
>>> 189 ?? Ss 0:02.67 postgres: myApp myApp 127.0.0.1(49162) idle
>>>
>>> Is there a way to close the connection without closing Toncat?
>>
>> Hmm. If you were managing your own pool then you could call close() on
>> the pool.
>>
>> Arguably, if Tomcat creates an context level pool, Tomcat should close
>> it when the context stops but I don't think it does. That probably calls
>> for some testing to check behaviour and possibly an enhancement request.
> this is my code to retrieve a connection
> -----------------------
> ambiente = (Context) new InitialContext().lookup("java:comp/env");
> pool = (DataSource) ambiente.lookup("jdbc/anArchive");
> Connection conn = pool.getConnection();
> ......
> conn.close(); // this in inside finally
> -----------------------
>
> but If my code is wrong removeAbandoned="true" is a guaranty to have the
> connection closed after few time (30sec). is this right?
Not really. It only closes connections your application has abandoned.
It won't touch the idle ones in the pool.
>> Can you close the connections from the database management tools?
> I'm sorry but: where can I found it? (Do you mean from postgres? can't
> figure how)
Yes. Sorry, I don't know postgres.
> I am searching for that also inside tomcatProbe but can't find it.
I don't think it supports it.
Mark
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Edoardo Panfili <ed...@aspix.it>.
Mark Thomas ha scritto:
> Edoardo Panfili wrote:
>> Hy,
>>
>> I have one webapp in Tomcat 6.0.18 with this context:
>>
>> <Context path="/myApp" docBase="myApp" debug="100" reloadable="true">
>> <Resource name="jdbc/myApp" auth="Container"
>> type="javax.sql.DataSource"
>> maxActive="8" maxIdle="5" maxWait="300"
>> username="myApp" password="passwd"
>> driverClassName="org.postgresql.Driver"
>> url="jdbc:postgresql://127.0.0.1:5432/myApp"
>> removeAbandoned="true"
>> removeAbandonedTimeout="30"
>> logAbandoned="true"
>> />
>> </Context>
>>
>> After application stop (using tomcat manager) I'd like to (drastic
>> example) rename the db, but I can't do it because there are open
>> connections.
>>
>> There are no other application using myApp db, but with "ps ax" I can see:
>>
>> 189 ?? Ss 0:02.67 postgres: myApp myApp 127.0.0.1(49162) idle
>>
>> Is there a way to close the connection without closing Toncat?
>
> Hmm. If you were managing your own pool then you could call close() on
> the pool.
>
> Arguably, if Tomcat creates an context level pool, Tomcat should close
> it when the context stops but I don't think it does. That probably calls
> for some testing to check behaviour and possibly an enhancement request.
this is my code to retrieve a connection
-----------------------
ambiente = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource) ambiente.lookup("jdbc/anArchive");
Connection conn = pool.getConnection();
......
conn.close(); // this in inside finally
-----------------------
but If my code is wrong removeAbandoned="true" is a guaranty to have the
connection closed after few time (30sec). is this right?
> Can you close the connections from the database management tools?
I'm sorry but: where can I found it? (Do you mean from postgres? can't
figure how)
I am searching for that also inside tomcatProbe but can't find it.
thank you
Edoardo
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Mark Thomas <ma...@apache.org>.
Edoardo Panfili wrote:
> Hy,
>
> I have one webapp in Tomcat 6.0.18 with this context:
>
> <Context path="/myApp" docBase="myApp" debug="100" reloadable="true">
> <Resource name="jdbc/myApp" auth="Container"
> type="javax.sql.DataSource"
> maxActive="8" maxIdle="5" maxWait="300"
> username="myApp" password="passwd"
> driverClassName="org.postgresql.Driver"
> url="jdbc:postgresql://127.0.0.1:5432/myApp"
> removeAbandoned="true"
> removeAbandonedTimeout="30"
> logAbandoned="true"
> />
> </Context>
>
> After application stop (using tomcat manager) I'd like to (drastic
> example) rename the db, but I can't do it because there are open
> connections.
>
> There are no other application using myApp db, but with "ps ax" I can see:
>
> 189 ?? Ss 0:02.67 postgres: myApp myApp 127.0.0.1(49162) idle
>
> Is there a way to close the connection without closing Toncat?
Hmm. If you were managing your own pool then you could call close() on
the pool.
Arguably, if Tomcat creates an context level pool, Tomcat should close
it when the context stops but I don't think it does. That probably calls
for some testing to check behaviour and possibly an enhancement request.
Can you close the connections from the database management tools?
Mark
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Edoardo Panfili <ed...@aspix.it>.
Mark Thomas ha scritto:
> Edoardo Panfili wrote:
>> Using this code in destroy() method of a servlet marked as
>> <load-on-startup>1</load-on-startup>
>
> Yep - that is the sort of code you'd need. Using a context listener
> would be a better solution as Tomcat is free to call destroy() on your
> Servlet whenever it likes.
Thank again (to you and the list)
edoardo
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Mark Thomas <ma...@apache.org>.
Edoardo Panfili wrote:
> Using this code in destroy() method of a servlet marked as
> <load-on-startup>1</load-on-startup>
Yep - that is the sort of code you'd need. Using a context listener
would be a better solution as Tomcat is free to call destroy() on your
Servlet whenever it likes.
Mark
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Edoardo Panfili <ed...@aspix.it>.
Alan Chaney ha scritto:
> I don't think so. Let me recap your problem:
>
> When you undeploy an application from tomcat (using the DBCP pooling
> mechanism) you can't make STRUCTURAL changes to the database because it
> complains that connections are still in use.
>
> This is exactly what one would expect. I've encountered the same
> problem. When an application finishes with a database connection it is
> returned to the pool. That's exactly what a connection pool is for!
>
> As far as I can see by looking at the tomcat source code the connection
> pool is created at startup and remains active until TC shutdown. Once a
> connection has been obtained from the pool it may stay 'active' for the
> entire duration of the TC session (that is, from TC start to TC stop)
>
> Obviously, depending upon your usage, it is possible for more than one
> application in the same container to be reusing the same connection
> pool. Your original post indicates that only one app. is using the
> database.
>
> It seems to me that:
> .....
> 3. As I assume you are using DBCP in Tomcat, carefully read the DBCP
> docs, configure your system so that you can directly access the POOLED
> connections, keep a list of ALL the connections you use and then shut
> them down at the end. This is fraught with difficulty.
Using this code in destroy() method of a servlet marked as
<load-on-startup>1</load-on-startup>
seems work
-------------------
try {
Context ambiente = (Context) new
InitialContext().lookup("java:comp/env");
DataSource pool = (DataSource) ambiente.lookup("jdbc/anArchive");
if(pool instanceof org.apache.tomcat.dbcp.dbcp.BasicDataSource){
org.apache.tomcat.dbcp.dbcp.BasicDataSource source =
(org.apache.tomcat.dbcp.dbcp.BasicDataSource) pool;
System.out.println("closing source...");
source.close();
System.out.println("closed.");
// System.out.println("maxIdle:"+source.getMaxIdle());
// source.setMaxIdle(0);
// System.out.println("maxIdle:"+source.getMaxIdle());
}
} catch (Exception e) {
e.printStackTrace();
}
-------------------
"source.setMaxIdle(0);" is not necessary.
also accessToUnderlyingConnectionAllowed="true" in context is not necessary.
Edoardo
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Edoardo Panfili <ed...@aspix.it>.
Alan Chaney ha scritto:
> Edoardo wrote
>> I have
>> resultset.close();
>> statement.close();
>> connection.close();
>> in my code.
>>
>> and
>> connection = dataSource.getConnection();
>> seems very close to my
>> ambiente = (Context) new InitialContext().lookup("java:comp/env");
>> pool = (DataSource) ambiente.lookup("jdbc/myApp);
>> Connection conn = pool.getConnection();
>> there are a lot of debug information in my code and seems that nothing
>> is going wrong (no exceptions).
>>
>> but... if you post that it means that I am doing something wrong.
>>
>> Edoardo
> I don't think so. Let me recap your problem:
>
> When you undeploy an application from tomcat (using the DBCP pooling
> mechanism) you can't make STRUCTURAL changes to the database because it
> complains that connections are still in use.
Yes.
> This is exactly what one would expect. I've encountered the same
> problem. When an application finishes with a database connection it is
> returned to the pool. That's exactly what a connection pool is for!
>
> As far as I can see by looking at the tomcat source code the connection
> pool is created at startup and remains active until TC shutdown. Once a
> connection has been obtained from the pool it may stay 'active' for the
> entire duration of the TC session (that is, from TC start to TC stop)
>
> Obviously, depending upon your usage, it is possible for more than one
> application in the same container to be reusing the same connection
> pool. Your original post indicates that only one app. is using the
> database.
Yes.
> It seems to me that:
>
> 1. you could just shutdown tomcat! If this is a production site the best
> plan would be to write a script which renames the database and does
> whatever else you need, test it on a development machine and just find a
> 'quiet' time to shutdown the site, update the db and restart.
This way is usable (and is the easiest, i need less that 30sec). At the
present time is also usable (not very high traffic) but I'd like to find
a definitive solution.
> 2. Move the connection pool into your application. Thus shutting down
> the application would shutdown the pool.
:-) some times ago the pool was managed by my application with some
custom code, in the new version of the system I rely on tomcat (hope
that this choice is not so bad!)
> 3. As I assume you are using DBCP in Tomcat, carefully read the DBCP
> docs, configure your system so that you can directly access the POOLED
> connections, keep a list of ALL the connections you use and then shut
> them down at the end. This is fraught with difficulty.
Your assumption is right.
This seems non so easy, but I will try.
Thank you very much for your (and other users) help.
Edoardo
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Alan Chaney <al...@compulsivecreative.com>.
Edoardo wrote
> I have
> resultset.close();
> statement.close();
> connection.close();
> in my code.
>
> and
> connection = dataSource.getConnection();
> seems very close to my
> ambiente = (Context) new InitialContext().lookup("java:comp/env");
> pool = (DataSource) ambiente.lookup("jdbc/myApp);
> Connection conn = pool.getConnection();
> there are a lot of debug information in my code and seems that nothing
> is going wrong (no exceptions).
>
> but... if you post that it means that I am doing something wrong.
>
> Edoardo
I don't think so. Let me recap your problem:
When you undeploy an application from tomcat (using the DBCP pooling
mechanism) you can't make STRUCTURAL changes to the database because it
complains that connections are still in use.
This is exactly what one would expect. I've encountered the same
problem. When an application finishes with a database connection it is
returned to the pool. That's exactly what a connection pool is for!
As far as I can see by looking at the tomcat source code the connection
pool is created at startup and remains active until TC shutdown. Once a
connection has been obtained from the pool it may stay 'active' for the
entire duration of the TC session (that is, from TC start to TC stop)
Obviously, depending upon your usage, it is possible for more than one
application in the same container to be reusing the same connection
pool. Your original post indicates that only one app. is using the database.
It seems to me that:
1. you could just shutdown tomcat! If this is a production site the best
plan would be to write a script which renames the database and does
whatever else you need, test it on a development machine and just find a
'quiet' time to shutdown the site, update the db and restart.
2. Move the connection pool into your application. Thus shutting down
the application would shutdown the pool.
3. As I assume you are using DBCP in Tomcat, carefully read the DBCP
docs, configure your system so that you can directly access the POOLED
connections, keep a list of ALL the connections you use and then shut
them down at the end. This is fraught with difficulty.
Regards
Alan
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Edoardo Panfili <ed...@aspix.it>.
Martin Gainty ha scritto:
>
> javax.sql.DataSource
> dataSource ;
> java.sql.Connection connection;
> java.sql.Statement statement;
> java.sqlResultset resultSet;
> code..
>
> try{
> connection = dataSource.getConnection();
> statement = connection.prepareStatement("SELECT FU FROM BAR");
> resultSet = statement.executeQuery();
> }
> catch (SQLException sqlEx)
> {
> try
> {
> resultset.close();
> statement.close();
> connection.close();
> }
> catch(java.sql.SQLException excp)
> {
> log.debug("A SQLException has been produced another Exception on resultset/statement/connection was produced where the message="=excp.getMessage());
> }
> }
> catch (Exception ex)
> {
> try
> {
> resultset.close();
> statement.close();
> connection.close();
> }
> catch(java.sql.SQLException excp)
> {
> log.debug("A General Exception has been produced another SQLException on
> resultset/statement/connection was produced where the
> message="=excp.getMessage());
> }
> }
> catch(java.sql.SQLException excp)
> {
> log.debug("SQLException on resultset/statement/connection close message="=excp.getMessage());
> }
> }
> finally
> {
> try
> {
> resultset.close();
> statement.close();
> connection.close();
> }
> catch(java.sql.SQLException excp)
> {
> log.debug("Exception on resultset/statement/connection close message="=excp.getMessage());
> }
> } //end finally..
>
>
I have
resultset.close();
statement.close();
connection.close();
in my code.
and
connection = dataSource.getConnection();
seems very close to my
ambiente = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource) ambiente.lookup("jdbc/myApp);
Connection conn = pool.getConnection();
there are a lot of debug information in my code and seems that nothing
is going wrong (no exceptions).
but... if you post that it means that I am doing something wrong.
Edoardo
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: How to close open connections after application stop?
Posted by Christopher Schultz <ch...@christopherschultz.net>.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Martin,
On 2/22/2009 10:26 AM, Martin Gainty wrote:
> catch (SQLException sqlEx)
> {
> try
> {
> resultset.close();
> statement.close();
> connection.close();
> }
It's kind of silly to call close() on all these resources in the
exception handles when you're just going to:
> finally
> {
> try
> {
> resultset.close();
> statement.close();
> connection.close();
> }
> catch(java.sql.SQLException excp)
> {
> log.debug("Exception on resultset/statement/connection close message="=excp.getMessage());
> }
> } //end finally..
...close them all in the finally block. Also, each close() method should
be surrounded by try/catch blocks and appropriate log messages. Finally,
logging exception stack traces is always helpful.
- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAkmiDwQACgkQ9CaO5/Lv0PBHmQCfcUww2dA6wQqlY/1PWpxUGA2b
XpsAn2Bg/V3AVSBWMDcFcax8A6DkUo50
=urPv
-----END PGP SIGNATURE-----
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
RE: How to close open connections after application stop?
Posted by Martin Gainty <mg...@hotmail.com>.
javax.sql.DataSource
dataSource ;
java.sql.Connection connection;
java.sql.Statement statement;
java.sqlResultset resultSet;
code..
try
{
connection = dataSource.getConnection();
statement = connection.prepareStatement("SELECT FU FROM BAR");
resultSet = statement.executeQuery();
}
catch (SQLException sqlEx)
{
try
{
resultset.close();
statement.close();
connection.close();
}
catch(java.sql.SQLException excp)
{
log.debug("A SQLException has been produced another Exception on resultset/statement/connection was produced where the message="=excp.getMessage());
}
}
catch (Exception ex)
{
try
{
resultset.close();
statement.close();
connection.close();
}
catch(java.sql.SQLException excp)
{
log.debug("A General Exception has been produced another SQLException on
resultset/statement/connection was produced where the
message="=excp.getMessage());
}
}
catch(java.sql.SQLException excp)
{
log.debug("SQLException on resultset/statement/connection close message="=excp.getMessage());
}
}
finally
{
try
{
resultset.close();
statement.close();
connection.close();
}
catch(java.sql.SQLException excp)
{
log.debug("Exception on resultset/statement/connection close message="=excp.getMessage());
}
} //end finally..
Martin
______________________________________________
Disclaimer and confidentiality note
Everything in this e-mail and any attachments relates to the official business of Sender. This transmission is of a confidential nature and Sender does not endorse distribution to any party other than intended recipient. Sender does not necessarily endorse content contained within this transmission.
> Date: Sun, 22 Feb 2009 11:25:42 +0100
> From: edoardo@aspix.it
> To: users@tomcat.apache.org
> Subject: How to close open connections after application stop?
>
> Hy,
>
> I have one webapp in Tomcat 6.0.18 with this context:
>
> <Context path="/myApp" docBase="myApp" debug="100" reloadable="true">
> <Resource name="jdbc/myApp" auth="Container"
> type="javax.sql.DataSource"
> maxActive="8" maxIdle="5" maxWait="300"
> username="myApp" password="passwd"
> driverClassName="org.postgresql.Driver"
> url="jdbc:postgresql://127.0.0.1:5432/myApp"
> removeAbandoned="true"
> removeAbandonedTimeout="30"
> logAbandoned="true"
> />
> </Context>
>
> After application stop (using tomcat manager) I'd like to (drastic
> example) rename the db, but I can't do it because there are open
> connections.
>
> There are no other application using myApp db, but with "ps ax" I can see:
>
> 189 ?? Ss 0:02.67 postgres: myApp myApp 127.0.0.1(49162) idle
>
> Is there a way to close the connection without closing Toncat?
>
> thank you
> Edoardo
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
_________________________________________________________________
Windows Live™ Hotmail®…more than just e-mail.
http://windowslive.com/howitworks?ocid=TXT_TAGLM_WL_t2_hm_justgotbetter_howitworks_022009