Skip to main content

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: Software caused connection abort: recv failed
STACKTRACE:
java.net.SocketException: Software caused connection abort: recv failed


Environment: Apache Tomcat 6.0.14 with MySQL 5.2

This is the exception which was the night mare for many developers who used MySQL with Java Web application in Tomcat server. Before explaining the cause let me told you that, the exception has responsible for pulling my hair for almost 2 weeks, with little use of Googling and MySQL Forum!

Particularly, the problem was, I lost my connection object when server is idle for 24 to 34 hours, so any request comes after this time interval results in above exception.

Disclaimer: The below explanation is as per my understanding and as I’m not an architecture of MySQL JConnector nor Apache DBCP API, Comments & Suggestions are welcomed, See this link from where I derived my explanation

This exception, in my case, comes when a connection has opened by MySQL on the request of Apache DBCP, but which is no more (valid) connected to actual Data Source!! So that when we close the connection by
connection.close();
its actually closes the resource opened with Apache DBCP source , but not with MySQL instanced connection , so that connection from MySQL to DBCP source remained in memory for the time_out period(If this time elapsed the connection get automatically closed by MySQL, its an environment variable).
So there is two connection opened, one from application to DBCP and another from DBCP to MySQL (TCP/IP link). See for diagram



Now, the solution part,


The problem is underlying structure of Apache DBCP code, which actually opens the connection with MySQL, but we can’t forced or tell the DBCP to close the connection, but we can take an working, valid connection from server, by telling them to validate it before returning new connection from Data Source !

For that, we have to pass some attribute to server!

So your context.xml looks like,



<context>
<Resource auth="Container"
driverClassName="com.mysql.jdbc.Driver"
maxActive="5"
maxIdle="1"
maxWait="10000"
name="jdbc/TestDS"
username="root"
password="password"
type="javax.sql.DataSource"
url="jdbc:mysql://127.0.0.1:3306/TestDS?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&maintainTimeStats=false""
removeAbandoned="true"
logAbandoned="true"
removeAbandonedTimeout="3600"
validationQuery="SELECT 1"
testOnBorrow="true"
testOnReturn="false"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="1000"
minEvictableIdleTimeMillis="60000"
poolPreparedStatements="true"
maxOpenPreparedStatements="10"/>
</context>



The explanation of above attribute can be viewed here:
http://commons.apache.org/dbcp/configuration.html

This will solve the above exception !!

Comments

Unknown said…
You save my day! i pulled my hair for 1 week. =)
techmythoughts said…
Hi Oliver, its nice to know that it "finally" helps you.. ;)

Popular posts from this blog

Installing i3lock-color on Ubuntu

i3lock is fancy lock screen for Linux. There is i3lock dep available on Ubuntu but its not what I was looking for; I was more interested in i3lock-color . Lets see how we can install the same on ubuntu. PS: I'm using Ubuntu 16.04 Get source code for i3lock-color $ git clone https://github.com/PandorasFox/i3lock-color.git  $ cd i3lock-color Install required packages to build i3lock  $ apt install libev-dev $ apt install libxcb-composite0 libxcb-composite0-dev libxcb-xinerama0 libxcb-randr0  $ apt install libxcb-xinerama0-dev  $ apt install libxcb-xkb-dev  $ apt install libxcb-image0-dev  $ apt install libxcb-util-dev $ apt install libxkbcommon-x11-dev $ apt install libjpeg-turbo8-dev  $ apt install libpam0g-dev Build  $ autoreconf -i && ./configure && make Execute $ ./lock.sh Assign Shortcut In order to assign shortcut, install compizconfig $ sudo apt-get install compizconfig-settings-manager co...

GlassFish V3 admin console taking too much time to load.

If you have installed Glassfish V3 and trying to load admin console, but after signing in, is it taking too much time to get to the main page ? Do you have server.log entry like this: admin console: initSessionAttributes() Cannot refresh Catalog : Connection timed out then its time to tweak some files. Here its how: 1. Update the %GLASSFISH_HOME/glassfish/domains/domain1/domain.xml -Dcom.sun.enterprise.tools.admingui.NO_NETWORK=true This will block up the News item, the registration item, etc 2. Remove update tool jar (Backup and remove this JAR) %GLASSFISH_HOME/glassfish/modules/console-updatecenter-plugin.jar Delete this dir: %GLASSFISH_HOME/glassfish/domains/domain1/osgi-cache %GLASSFISH_HOME/glassfish/domains/domain1/generated Now start the server (bin/asadmin start-domain) and you will see the admin console won't be hang up and take you directly to main page.

Java Generics: Why I get "name clash" exception when I override methods with different "type" parameter ?

import java.util.*; class Parent { void foo(List<String> list) { System.out.println("parent"); } } class Child extends Parent { void foo(List<Integer> list) { System.out.println("child"); } } When you compile this code you will get an error like Parent.java:7: name clash: foo(java.util.List<java.lang.Integer>) in Child and foo(java.util.List<java.lang.String>) in Parent have the same erasure, yet neither overrides the other class Child extends Parent { ^ 1 error This "name clash" error thrown because of "type erasure" thing when "generics" code gets complied. Let’s see how, When we complied any generics code, the compiler removes the type from the code and treat it as a simple pre Java 1.5 code, like, in our case, compiler saw something like this, import java.util.*; class Parent { void foo(List list) { // oops, <String> get erased. System.out.println("parent"); } } class Child extend...