Hello I wonder if anyone can advise me on this issue. I have a Tomcat 6.X Java / JSP application which uses connection pooling to access a MySQL database but, if the application is left for up to eight hours, one of the pages fails to display the contents of a dataset upon loading.
Looking into the logs, I find that I have the following: ERROR|29 09 2009|08 42 19|http-8080-4|myDataSharer.database_access.Database_Metadata_DBA| - Error getting types of columns of tabular Dataset 12 com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.io.EOFException STACKTRACE: java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1956) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2368) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2867) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1616) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1708) at com.mysql.jdbc.Connection.execSQL(Connection.java:3255) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1293) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1428) at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93) at myDataSharer.database_access.Database_Metadata_DBA.getTabDSColumnTypes(Database_Metadata_DBA.java:364) at myDataSharer.database_access.Dataset_DBA.getTabDSAsHTMLTable(Dataset_DBA.java:1266) And so on for several hundred lines. Now the page in question is meant to display data from one of a number of tables in MySQL which vary in their column types. Each table forms a dataset which is created from data extracted from RSS feeds or an Excel / CSV file uploaded by a user, hence the varying table column types. So, in the absence of defined object types, what the application does is to look up the table's column types in a query (Database_Metadata_DBA.getTabDSColumnTypes) and then use the output from this to build a HTML table (Dataset_DBA.getTabDSAsHTMLTable) which is returned to the servlet for displaying in a JSP. Each database operation uses code similar to the example below and these work perfectly normally. But I think what is happening after eight hours of inactivity, is that the system is trying to reuse a connection pool object that MySQL has closed down after its default eight hour period. But I can't seem to resolve this problem and I wonder if anyone can advise? The relevant part of my application's context.xml file is: name = "jdbc/myDataSharer" auth = "Container" maxActive = "100" maxIdle = "30" maxWait = "10000" username = "XXXX" password = "XXXXXXXXXX" driverClassName = "com.mysql.jdbc.Driver" url = "jdbc:mysql://XXXXXXXXXX:XXXX/myDataSharer?autoReconnect=true" logAbandoned = "true" minEvictableIdleTimeMillis = "30000" numTestsPerEvictionRun = "5" removeAbandoned = "true" removeAbandonedTimeout = "120" testOnBorrow = "false" testOnReturn = "false" testWhileIdle = "true" timeBetweenEvictionRunsMillis = "60000" type = "javax.sql.DataSource" validationQuery = "select now()" /> And my application uses servlets which generally have several database IO operations each of the form : public static Dataset getDataset(int DatasetNo) { ConnectionPool_DBA pool = ConnectionPool_DBA.getInstance(); Connection connection = pool.getConnection(); PreparedStatement ps = null; ResultSet rs = null; String query = ("SELECT * " + "FROM Dataset " + "WHERE DatasetNo = ?;"); try { ps = connection.prepareStatement(query); ps.setInt(1, DatasetNo); rs = ps.executeQuery(); if (rs.next()) { Dataset d = new Dataset(); d.setDatasetNo(rs.getInt("DatasetNo")); d.setDatasetName(rs.getString("DatasetName")); ... } return d; } else { return null; } } catch(Exception ex) { logger.error("Error getting Dataset " + DatasetNo + "\n", ex); return null; } finally { DatabaseUtils.closeResultSet(rs); DatabaseUtils.closePreparedStatement(ps); pool.freeConnection(connection); } Where class ConnectionPool_DBA is my own DBCP-based class. Apologies for the length of this message but any help would be much appreciated. Is there a MySQL setting which should be changed at all? Thanks Martin O'Shea. -- View this message in context: http://www.nabble.com/Tomcat-6.X-and-MySQL-connection-pooling-issue-tp25677820p25677820.html Sent from the Tomcat - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org