美文网首页
Broken pipe 与 Hibernate

Broken pipe 与 Hibernate

作者: 炒鸡大馒头 | 来源:发表于2018-07-13 00:02 被阅读0次
  • broken pipe

导致broken pipe的原因有很多,不过其根本原因都是:当往socket管道写入数据的时候,管道已经关闭。某次查生产问题的时候,发现日志中有很多booken pipe的错误,都发生在当服务器向客户端返回页面内容的情况下。

java.io.IOException: Broken pipe

导致这个错误的主要原因是,当浏览器发起请求,服务端处理时间较长,在服务端还没有返回响应内容的时候,浏览器端就断开了连接(关闭浏览器,删除iframe等)。

  • 所以正常情况下出现这个问题,其实并不影响业务的运行
  • hibernate set 自动更新
//执行完之后,数据库中该用户的名称会被修改成newName
UserDTO user = userDao.findUserByCode("userCode");
user.setUserName("newName");

相信很多人都碰到过这个问题,当对hibernate查询出来的某个实体类进行set操作的时候,即使没有调用 update方法,这个值也会被更新到数据库中。

不过也不是每次进行set操作就一定会被更新到数据库。必须满足Hibernate sessionFlushModeAUTO,COMMIT,ALWAYS状态。如果FlushModeNEVEL或者MANUAL,那么该 set操作就不会被更新到数据库。而spring的非readOnly事务则会修改Hibernate sessionFlushModeAUTO

假设spring事务配置如下:

<bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
       <property name="beanNames"> 
          <list> 
             <value>*Service</value> 
          </list> 
       </property> 
       <property name="interceptorNames"> 
          <list> 
             <value>transactionInterceptor</value> 
          </list> 
       </property> 
</bean>

上述配置表示所有以Service结尾的bean都会生成事务代理类

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
        <property name="transactionManager"> 
            <ref bean="transactionManager" /> 
        </property>  
        <!-- 配置事务属性 --> 
        <property name="transactionAttributes"> 
           <props> 
              <prop key="save*">PROPAGATION_REQUIRED</prop> 
              <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> 
          </props> 
       </property> 
</bean> 

上述配置表示find开头的方法是readOnly模式,此时hibernate session对应的FlushModeMANUALsave开头的方法对应的FlushModeAUTO

  • newName会更新到数据库
UserDTO user = userDao.findUserByCode("userCode");
user.setUserName("newName");
xxxService.saveSomething();
  • newName不会更新到数据库
UserDTO user = userDao.findUserByCode("userCode");
user.setUserName("newName");
xxxService.findSomething();

在使用struts的时候,通常我们会设置异常拦截器:

<interceptors>
     <interceptor name="ExceptionInterceptor" class="com.xxx.ExceptionInterceptor">
     </interceptor>
</interceptors>

异常拦截器中除了会有记录日志,发送邮件报警以外,也有把异常信息保存到数据库的情况:

ExceptionService.saveExceptionInfo(e.getMessage());

那么此时 hibernate sessionFlushMode就会被设置为AUTO,导致对DTO的set操作会被保存到数据库。

总结

当你在Action中执行hibernate查询操作,并且对查询出来的hibernate实体类进行set操作修改值的时候,如果此时,前端关闭了浏览器,导致服务端抛出broken pipe错误,进入struts异常拦截器,把错误信息记录到数据库,导致将hibernate sessionFlushMode 变成了 AUTO,此时set的新值就会被更新到数据库,从而导致其他业务问题。

相关文章

  • Broken pipe 与 Hibernate

    broken pipe 导致broken pipe的原因有很多,不过其根本原因都是:当往socket管道写入数据的...

  • charles map local socket broken

    fix the "charles map local socket broken pipe (write fail...

  • dart: socket error错误一览

    SocketException: OS Error: Broken pipe, errno = 32 这个错误其实...

  • Broken pipe 问题

    结论 915投产演练时,因服务器刀容存在问题,引起了网络抖动,致使响应时间超长,耗尽了渠道接入数量,积累大量请求得...

  • pipe broken问题

    $ ssh -o ServerAliveInterval=60 user@sshserver让当前ssh永远保持链接

  • ssh

    ssh--write failed broken pipe 转自newinstance I started to ...

  • 闹心的Broken pipe

    林子大了什么鸟都有,程序猿做久了什么bug都有。 bug描述 出现在excel导入的时候 线上有问题,本地不可重现...

  • ssh出现broken pipe

    因为修改一些东西,出现broken pipe 只需 找到对应服务器ip所在行,删除

  • writeFully: failed: Broken pipe

    writeFully: failed: Broken pipe exit(-100)一般是用模拟器运行a...

  • Django uwsgi Broken pipe error

    uwsgi Broken pipe Note: 为了方便多处发表所以用了英文Created: Jul 30, 20...

网友评论

      本文标题:Broken pipe 与 Hibernate

      本文链接:https://www.haomeiwen.com/subject/hpdiuftx.html