我使用jdbc开发了个j2ee小系统,数据库用的是mysql5,部署的服务器为tomcat; 一般情况下没有什么问题,在开发中也是偶然发现,我的电脑没有关,部署的服务器一直运行着, 长时间没有使用,第二天一来再点击系统,则后台出现如下异常:
- Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.SocketException MESSAGE: Software caused connection abort: socket write error STACKTRACE: java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(Unknown Source) at java.net.SocketOutputStream.write(Unknown Source) at java.io.BufferedOutputStream.flushBuffer(Unknown Source) at java.io.BufferedOutputStream.flush(Unknown Source) at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2744) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) at com.mysql.jdbc.Connection.execSQL(Connection.java:3277) at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1402) at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317) ** END NESTED EXCEPTION ** Last packet sent to the server was 0 ms ago.
在重启服务器后,一切又正常运行。 从以上异常可以看出,是tomcat服务器与mysql数据库服务器之间已失去连接。 查找相关资料,发现原因如下: tomcat与数据库建立长连接以后,mysql会建立一个Socket与tomcat通信。mysql建立的Socket 有个timeout时间(超时时间),它的默认值是3600*8(28800),若改连接在8个小时内没有操作 的话,mysql会断开该连接,而tomcat中Connection并不知道远程Socket已关闭,也没有更新自 己的连接状态。 解决办法:在判断Connection没有关闭并且不等于null的时候,通过一个简单的sql操作,判断连 接是否超时,如果超时的话重新建立连接,如果没有超时返回原来的连接。 示例代码如下:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.log4j.Logger; public class DbConnection { private static Logger LOG = Logger.getLogger(DbConnection.class); private static Connection singleConnect = null; public static Connection getSingleConnection() { try { if (singleConnect != null && !singleConnect.isClosed()) { /** * MySQL数据库Socket超时(timeout)是3600*8,即超过8小时,数据库会断开外部的连接,而外部连接的状态没更新 */ Statement pingStatement = null; ResultSet pingResultSet = null; try { pingStatement = singleConnect.createStatement(); pingResultSet = pingStatement.executeQuery("select 1"); } catch (Exception e) { connectionSingle(); } finally { if (pingResultSet != null) { pingResultSet.close(); } if (pingStatement != null) { pingStatement.close(); } } return singleConnect; } else { connectionSingle(); return singleConnect; } } catch (SQLException e) { LOG.error(e.getMessage()); return null; } } private static void connectionSingle() { try { LOG.info("connectionBase is called"); if (singleConnect != null && !singleConnect.isClosed()) { singleConnect.close(); singleConnect = null; } Class.forName("com.mysql.jdbc.Driver"); singleConnect = DriverManager .getConnection( "jdbc:mysql://127.0.0.1:3306/anxiesoft?useUnicode=true&characterEncoding=UTF-8&noAccessToProcedureBodies=true", "mysql", "passord"); singleConnect.setAutoCommit(false); LOG.info("connectionBase finished"); } catch (ClassNotFoundException cnfe) { LOG.error(new java.util.Date().toString() + " database driver not found:" + cnfe.getMessage()); } catch (SQLException sqle) { LOG.error(new java.util.Date().toString() + " database connect error:" + sqle.getMessage()); connectionSingle(); } } }
相关推荐
- 当客户端尝试通过`getInputStream().read()`方法读取服务端的响应数据时,如果服务端端口已经关闭或连接已被中断,Java会抛出“Software caused connection abort: recv failed”异常。 - 此类异常多发生在非阻塞...
解决TestNG单元测试报错Software caused connection abort: socket write error
连接服务器失败(错误原因:Connection refused) error 111 抓包结果
我真的佛了,我把电脑都重装系统了,没想到还是有问题,最终我找到了解决方案。 (我指的重装系统就是win10自带的功能,可能...Network error: Software caused connection abort 原创文章 6获赞 8访问量 726 关注
### 错误解析:Caused by: android.system.ErrnoException: write failed: ENOSPC (No space left 在Android开发过程中,可能会遇到“Caused by: android.system.ErrnoException: write failed: ENOSPC (No space ...
4. **java.net.SocketException: (Connection reset 或 Connect reset by peer: Socket write error)** 这两种异常都表示连接已断开。可能的原因是一端关闭了Socket,而另一端仍在尝试读写。处理这类异常需要检测到...
* Connection reset by peer:Connection reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器端之间的连接断开后,导致连接的一端继续发送数据,引发该异常。 实践经验 通过实践经验,我们可以...
Java连接达梦数据库驱动dm_jdbc: dm_jdbc\com.dameng.floader.jar dm_jdbc\com.dameng.impexp.jar dm_jdbc\Dm7Dictionary.jar dm_jdbc\Dm7JdbcDriver14.jar dm_jdbc\Dm7JdbcDriver15.jar dm_jdbc\Dm7JdbcDriver16....
- **Socket error #10053 - Software caused connection abort**:软件导致连接中断。 - **Socket error #10055 - No buffer space available**:没有可用的缓冲空间。 - **Socket error #10056 - Socket is already...
在数据库连接池配置中,确保JDBC连接的`ResultSet`类型被设置为支持分页操作的类型,如`TYPE_SCROLL_INSENSITIVE`或`TYPE_SCROLL_SENSITIVE`。 ### 总结 在处理数据库操作时,理解不同类型的查询结果集及其适用...
3. 网络故障,包括侦听器故障、网络接口卡故障和路由问题,可通过配置备份侦听器、使用冗余网络接口卡和备份网络连接来缓解。 4. 用户错误,如误删或修改数据,可以利用回滚操作或闪回查询来恢复。 5. 介质故障,...
3、Can’t connect to local MySQL server through socket ‘/Data/mydata/mysql.sock’ socket文件目录不对应导致的问题 4、今天要说的就是 没有打开only_full_group_by Cause:...
NavicatPremium 最新版下载安装文件,解决ssl连接失败问题
"java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver" ...[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket. 解决了jsp连接 sql server 2000的问题
Caused by: java.net.UnknownHostException: openapi.alipay.com
Socket Error 10053 - Software caused connection abort Socket Error 10053是指软件导致连接中断,这种错误通常是由于软件错误所致。解决方法是检查软件,确保它们正确。 Socket Error 10054 - Connection reset...
#### WSAECONNABORTED (10053): Software caused connection abort. - **含义**:一个已建立的连接被本机上的软件终止,可能是由于数据传输超时或协议错误。 - **解决方案**: - 检查是否有超时设置,并适当调整。...
这个问题通常是由于 Nginx 的连接数超过了系统设定的最大值造成的。下面是解决这个问题的方法。 一、临时修改 ulimit 值 可以使用 ulimit 命令来临时修改打开文件数的限制。例如,使用以下命令可以将打开文件数...
Cause com.mysql.jdbc.exceptions.jdbc4.CommunicationsException The last packet successfully received from the server was 47,795,922 milliseconds ago. The last packet sent successfully to the server was...
专题资料