Il semble que MySQL ou un pare-feu tue vos connexions inactives qui traînent dans votre pool de connexions jdbc pendant de longues périodes :
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 4,665,488 milliseconds ago.
Vérifiez la valeur de wait_timeout sur MySQL.
Vous pouvez jouer avec les Paramètres DBCP par exemple. validationQuery, testOnBorrow et testWhileIdle.
Une configuration qui est "ceinture et bretelles", et qui résoudra probablement votre problème au détriment des performances est :
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="validationQuery" value="SELECT 1"/>
<property name="testOnBorrow" value="true"/>
</bean>
Ce qui précède testera les connexions chaque fois que vous empruntez au pool.