关于技术遇到的各种坑

1. Timestamp从程序转到数据中sql报错

原因是程序中将Timestamp写成了TimeStamp,导致倒错包了,结果转不过去


2. 程序md5加密,在eclipse的tomcat环境和tomcat的环境中结果不一致

原因是md5程序没有设置编码,导致两个环境运行不一致,如下图所示:




3.关于spring异常事务

很多朋友在使用spring+hibernate或mybatis等框架时经常遇到报Transaction rolled back because it has been marked as rollback-only的异常,这个异常是怎么造成的

呢,下面将给大家进行详细的分析。

    这是专门写的一个造成该异常的代码:

[java]  view plain  copy
 print ?
  1. @Transactional  
  2.     public void add(OperateLog entity)throws Exception {  
  3.         // TODO Auto-generated method stub  
  4.         operateLogDao.add(entity);  
  5.     }  
[java]  view plain  copy
 print ?
  1. @Transactional  
  2.     public void save(Member member) throws Exception {  
  3.         memberDao.add(member);  
  4.     }  
  5.   
  6.     @Transactional  
  7.     public void add(Member member) throws Exception {  
  8.         try {  
  9.             this.save(member);  
  10.             /* 
  11.              * 日志的title长度为10 我把值设置为add111111111111111111是为了造成异常 
  12.              */  
  13.             OperateLog entity = new OperateLog("add111111111111111111""1111");  
  14.             operateLogService.add(entity);  
  15.         } catch (Exception e) {  
  16.             e.printStackTrace();  
  17.             // throw e;  
  18.         }  
  19.   
  20.     }  
执行以上代码就会报改异常,当我把

//throw e;的注释//去掉,当我执行后就不会有改异常,只会报标题title太长的异常。如下面提示:

[java]  view plain  copy
 print ?
  1. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column '_title' at row 1  
  2.     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4072)  
  3.     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)  
  4.     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)  
  5.     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)  
  6.     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)  
  7.     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)  
  8.     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)  
  9.     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371)  
  10.     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2355)  
  11.     at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)  
  12.     at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)  
  13.     at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)  
  14.     at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)  

通过以上的问题我们可以发现。在spring中,在事务方法中调用多个事务方法时,spring将会把这些事务合二为一。当整个方法中每个子方法没报错时,整个方法执行完才提交事务(大家可以使用debug测试),如果某个子方法有异常, spring将该事务标志为rollback only。如果这个子方法没有将异常往上整个方法抛出或整个方法未往上抛出,那么改异常就不会触发事务进行回滚,事务就会在整个方法执行完后就会提交,这时就会造成Transaction rolled back because it has been marked as rollback-only的异常,就如上面代码中未抛throw e 一样。如果我们往上抛了改异常,spring就会获取异常,并执行回滚。

4. 表单重复提交

莫名其妙的出现两条一样的数据。限制表单重复提交就行了

5. 按住F5不松,后台报错

Caused by: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。java.lang.IllegalStateException: getOutputStream() has already been called for this response

原因可能是按住f5不松开,浏览器会疯狂的刷新,疯狂的请求接口。结果导致服务器连接数被占满,然后强制关掉一些请求,导致抛出异常.
解决方案:f5按下去只能刷新一次,当松开再按下才再刷新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值