老项目采用tomcat出现异常:Connection reset by peer: socket write error 异常解决方法

项目一段时间就出现异常,导致无法登陆系统,数据库无法连接上
异常信息如下:
java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
    at oracle.jdbc.driver.OracleConnection.rollback(OracleConnection.java:1380)
    at com.newland.So.Transaction.executeQuery(Transaction.java:107)
    at com.newland.Dao.UserInfoDao.findUser(UserInfoDao.java:184)
    at com.newland.Blo.UserInfoBlo.findUser(UserInfoBlo.java:119)
    at org.apache.jsp.loginAction_jsp._jspService(loginAction_jsp.java:111)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.newland.So.EncodeFilter.doFilter(EncodeFilter.java:32)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:620)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:744)

解决过程:

出现上面的异常时因为tomcat的conf/context.xml没有加入数据库断开重连配置,配置如下(红字部分):

<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->
    <!--join break line reconnection config-->
    <span style="color:#ff0000;"><parameter> <name>validationQuery</name> <value>SELECT COUNT(*) FROM DUAL</value> </parameter>
    <parameter> <name>testOnBorrow</name> <value>true</value> </parameter>
    <parameter> <name>testOnReturn</name> <value>true</value> </parameter>
    <parameter> <name>testWhileIdle</name> <value>true</value> </parameter></span>

</Context>

配置完成重启还是会出现错误,怎么办呢,考虑用连接池获取连接的方式替代原来的jdbc连接,我选用了C3P0

下面是部分关键代码:

dataSource = new ComboPooledDataSource();
dataSource.setUser(ConnUserName);
dataSource.setPassword(ConnPassWord);
dataSource.setJdbcUrl(ConnUrl);

dataSource.setDriverClass("oracle.jdbc.driver.OracleDriver");
dataSource.setInitialPoolSize(initialPoolSize);
dataSource.setMinPoolSize(minPoolSize);
dataSource.setMaxPoolSize(maxPoolSize);
dataSource.setMaxStatements(maxStatements);
dataSource.setMaxIdleTime(maxIdleTime);
//连接池
	        if(dataSource!=null){
	        	conn = dataSource.getConnection();
	        }
 

用这种方式暂时解决了问题,至少不会出现登录不了系统的情况了

然后接着几天又出现问题了,登录不了了,重新想办法,设置连接池配置,不靠谱,因为IO断了,重连有问题,还是自己改程序吧

添加异常自动重连,以下是initDataSource关键代码,其他数据库连接的简单写法就不写了:

//如果是重连的,获取连接池的连接
            try {
                conn = dataSource.getConnection();
                conn.setAutoCommit(false);
            } catch (SQLException e) {
                e.printStackTrace();
                reConnect();//自动重连
            }

/** 如果初始化数据库失败无限次重连,直到连接成功为止
     * 为了解决异常:java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
     */
    public static void reConnect() {
        while (true) {
            if (conn == null) {
                logger.info("-----------------start reinit dataSource-----------------");
                Transaction.initDataSource();
            } else {
                break;
            }
        }
    }
/**
     * 查询数据,conn为空就自动重连
     * @param qstr
     * @return
     * @throws SQLException
     */
       public ResultSet executeQuery(String qstr) throws SQLException{
        ResultSet cResultSet = null;
        try{
            if(conn==null ){
                reConnect();
            }
            stmt = conn.createStatement();
            cResultSet = stmt.executeQuery(qstr);
        }
        catch(SQLException e) {
            stmt.close();
            conn.rollback();
            throw e;
        }
        return cResultSet;
    }
       /**
        * 数据更新,conn为空就自动重连
        * @param qstr
        * @throws SQLException
        */
    public void executeUpdate(String qstr) throws SQLException{
        try{
            if(conn==null ){
                reConnect();
            }
            stmt = conn.createStatement();
            stmt.executeUpdate(qstr);
            stmt.close();
        }
        catch(SQLException e) {
            stmt.close();
            conn.rollback();
            throw e;
        }
     }

在系统登录模块异常注入重连机制:

catch(SQLException e){
    e.printStackTrace();
    Transaction.initDataSource();
}

不知其他人是否有更好的方法来解决此类问题

时间: 2024-10-07 17:29:10

老项目采用tomcat出现异常:Connection reset by peer: socket write error 异常解决方法的相关文章

Jenkins Publish over SSH 异常:Connection reset by peer: socket write error

Jekins持续集成: 服务器时windows服务器: windows安装openssh服务: 安装包:https://github.com/PowerShell/Win32-OpenSSH/releases 开箱即用:步骤1 文件解压至C:\Program Files\OpenSSH 2 控制台cd至目录 3 执行powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 启动服务ssh; 踩坑的地方:当时没有把文件放到C:\Pr

connection reset by peer, socket write error问题分析

上次写<connection reset by peer, socket write error问题排查>已经过去大半年,当时把问题"敷衍"过去了. 但是此后每隔一段时间就会又想起来,baidu.google一番,可能也会再拉周围的人小讨论一下,然后无果而终.淡忘,想起,淡忘,又想起,挥之不去. 这个周末它又在脑海中浮现,这次总算理解了这个问题,答案就在一本买了很久的新书<HTTP权威指南>中.如果懒得看下面的啰嗦,可以去直接看书中的<4.7.4 正常关闭

Jmeter遇到线程链接被重置(Connection reset by peer: socket write error)的解决方法

做性能测试的时候遇到一个很奇怪的问题,多线程的计划,有一个线程第一次能跑过,第二次确跑不过,单独跑这个线程跑多少次都没有问题,把思考时间改短也没有问题,唯独出现在特定的状态下,特定状态是啥,也不得而知,反正是几个设置叠加再一起碰巧出现...我就郁闷了...墙外的朋友貌似都有人遇到,墙内的没搜到,所以写了这样一篇文章简单记录一下,解决方法: 现象如图 第一次成功,第二次失败,所以错误率是50% 取样器的结果是这样的: 具体的错误信息: 看上去像是jmeter的bug,百思不得其解.google之.

Connection reset by peer问题分析

extremetable导出excel,弹出一个下载窗口,这时不点下载而点取消,则报下面的异常: ClientAbortException Caused by: java.net.SocketException: Connection reset by peer: socket write error 查了下TOMCAT的文档,解释如下: Wrap an IOException identifying it as being caused by an abort of a request by

atitit.故障排除------有时会错误com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: soc

atitit.故障排除------有时会错误com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error 1. 现象::::有时会错误,大概20% 会中间... 1 2. 原因::原因:::sql server的bug 或者限制,查询的时候儿使用资源太多超过操作系统/防火墙/安全软件的限制.. 1 3. 解决方案:::retry3机制 1 4. 参考 1 1. 现象:::

Android通过Http协议POST请求异常(Connection reset by peer)

上周遇到了一个Connection reset by peer 网络连接问题,为此,我找遍了中英文的一些网站,搜遍了能找的每个角落,发现了出现这种状况的原理,该java异常在客户端和服务器端都有可能发生,引起该异常的原因有: Connection reset by peer的常见原因: 1)服务器的并发连接数超过了其承载量,服务器会将其中一些连接关闭: 如果知道实际连接服务器的并发客户数没有超过服务器的承载量,则有可能是中了病毒或者木马,引起网络流量异常.可以使用netstat -an查看网络连

Connection reset by peer 的常见原因:

Connection reset by peer的常见原因: 1)服务器的并发连接数超过了其承载量,服务器会将其中一些连接关闭: 如果知道实际连接服务器的并发客户数没有超过服务器的承载量,则有可能是中了病毒或者木马,引起网络流量异常.可以使用netstat -an查看网络连接情况. 2)客户关掉了浏览器,而服务器还在给客户端发送数据: 3)浏览器端按了Stop: 这两种情况一般不会影响服务器.但是如果对异常信息没有特别处理,有可能在服务器的日志文件中,重复出现该异常,造成服务器日志文件过大,影响

Connection reset by peer的常见原因

1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer). Socket默认连接60秒,60秒之内没有进行心跳交互,即读写数据,就会自动关闭连接. 2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset). 简单的说就是在连接断开后的读和写操作引起的. Connection reset by peer的常见原因: 1)服务器的并

文件上传时报Recv failure: Connection reset by peer异常解决

以前上传文件时报这个异常没这么在意,这次网络不好时总是报这个异常,导致文件上传失败,故特意说明一下,报个异常的原因还是很多的,今日只针对我当前遇上的问题进行记录一下. 背景:平时网络好的时候,我开启线程的上传和下载都没问题,网络慢的时候就出来这个异常 Recv failure: Connection reset by peer . 异常的原因有两点:1.网络非常慢时易导致该异常:2.线程多次重复请求网络服务造成的异常,因为上次启用的线程还没断开,所以该服务一直存在,导致再次进行上传请求时异常.