It was frustrating. I set up a Java JDBC connection pool to MySQL, and the app ran for awhile, then it would not connect. Obviously I had leaking connections somewhere.
The message in the transcript log was:
Data source rejected establishment of connection, message from server: "Too many connections"
I went and tried closing all of the connections, but the app is a fairly large one. What to do? I Googled around and there was no obvious way of seeing where the connection leak was, so I opted for brute force.
The pseudo code for establishing a connection with at connection pool looks like this:
DataSource ds=getDataSource();
Connection conn=ds.getConnection();
and to close the connection, it was:
conn.close();
So the way that I solved it and found the connection leak, was that I added a couple of lines to the above code.
In the open connection method, I added
System.out.println("Open Connection " + conn.toString();
and in the close method, before the close statement, I added:
System.out.println("Close Connection " + conn.toString();
It prints out stuff in the console like this:
Open Connection ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@e78c1b]]
Close Connection ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@e78c1b]]
I then match up the open and closes as I do stuff, and find my unclosed connections leaks.
Hope this helps.
No comments:
Post a Comment