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 compiz-plugins-extra and then go

INTO OUTFILE query, How to modify & output null values ?

I tried one query (originally asked at JR) on MySQL which export the table data into a file, with a comma delimited field. The query is straight forward and replace the null column value by "\N" character, but when I want to replace that "\N" value by some other character like "0" or simple empty field like " ", its gets little tricky. Here is the base query SELECT Id, name, age FROM student INTO OUTFILE 'c:/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; And it outputs like, 1, "sagar", 23 2, "anant", 24 Now suppose some 'name' fields are null, then it outputs like 1, "sagar", 23 2, \N, 24 Now to obtain my desired results, which replace this null (\N) values by empty string like, "", I tried out two solutions --1. Using CASE statement SELECT Id, CASE WHEN name IS NULL THEN '' ELSE name END AS NewName, age FROM s

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.