I have set up Tomcat to use a connection pool yet after the MySQL timeout on connections the connections previously open in the pool are not opened. Here is what my context.xml file looks like:
<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource"
maxActive="5" maxIdle="3" maxWait="10000"
username="uname" password="password" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/>
As you can see I have included autoReconnect as true yet it doesn't. I have checked the process on the database after 8 hours which is what the time out is set to.
With your configuration, it's not supposed to create another connection if it's idle. Try to add
With this setting, DBCP will maintain 3 connections all time.
We see exactly the same behavior with one of lightly used servers. Due to the default connection timeout of 8 hours, we see no connections when we come in the morning. That's what we expected. However, sometimes we see stale connection and the first request will fail. To get around this issue, you need add following attributes,
Try adding a validation query attribute. This should have the effect of automatically closing and re-opening the connection after a timeout like this:
Since this is urgent and for production I suggest you have look at a decent connection pool such as c3p0. It's more robust and reliable and can handle timeouts better.
First, get rid of the
autoReconnect
property. You don't need this with a connection pool and may cause problems.Second, ensure that you close all resources (
Connection
,Statement
andResultSet
) in your JDBC code in thefinally
block.I am not sure if this applies in your case, but a common misconception among starters is that they seem to think that you don't need to close those resources in case of a pooled connections. This is untrue. A pooled connection is a wrapper (decorator) around a connection which has a slightly changed
close()
method which roughly look likeWith other words, closing them frees up the pooled connection so that it can be put back in the pool for future reuse. If you acquire connections without closing them, then the pool will run out of connections sooner or later.