spring+nutz异常场景

1MYSQ

1.1测试环境

应用程序
基于spring+nutz的技术框架:
lightcore-launcher-common, lightcore-launcher-service
数据源为DFDB 1.0.2

MYSQL环境
mysql-5.7.23+centos7 在vmware环境

1.2主键冲突或唯一性索引异常

当主键发生冲突 或 某个字段加上唯一性索引后发生唯一性冲突时会报如下异常
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
另外:
spring+mybatis框架下主键冲突或唯一性索引后 mybatis会封装后报如下异常
org.apache.ibatis.exceptions.PersistenceException

1.3新增spring事务超时

如果设置事务超时时间后会报

org.springframework.transaction.TransactionTimedOutException: Transaction timed out: dealline was Mon Apr 12 19:28:42 CST 2021

1.3Query查询超时Update锁超时

查询超时场景测试说明
1.在dfdf的 PhysicalDataSources.xml 设置了queryTimeout 超时时间
2.执行一个 select * from t1,t2,t3 --其中t1,t2,t3分别存放10W条数据 查询时会超时
更新超时场景测试说明

  1. 在一个应用中debug模式下开启一个事物,执行更新(或select for update)打上断点后不提交
  2. 另一个应用程序也更新这条记录 触发应用程序的更新超时
  3. mysql的磁盘满了也会报这个异常你会发现insert语句总报执行超时

以下两种场景都会报如下异常
com.mysql.jdb.exceptions.MySQLTimeoutException:Statement cancelled due to timeout or client request
其中update超时后 最终更新语句不会触发数据库的修改

MySQLTimeoutException

在这里插入图片描述
这个现在不好说: 有一次测了发现 有的数据提交成功了
数据在主库执行时 把从库停了 stop slave 实际SQL还在主库执行 只不过此时主库最开始在等从库 触发了statemen超时 然后从库stop slave后 主库发现从挂了自己执行成功了 这个是事务自动提交的场景

1.4.网络断开

应用程序正在执行SQL操作时,将网卡禁用掉 模拟出网络断开场景

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

1.5网络阻塞

在vmware的网络适匹器中设置 kbps带宽比较小 造成网络阻塞

此时 会报两种异常
已经存在的应用连接 会报
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
对于新创建的连接会报
com.alibaba.druid.pool.GetConnectionTimeoutException:

1.6网络丢包

在vmware的网络适匹器中设置数据丢包率80%

会报如下
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

1.7网络延时

新建的连接会报
com.alibaba.druid.pool.GetConnectionTimeoutException
已经存在的连接会报
com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request

1.8数据库CPU飙高

推测
对于想新建连接时
com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10001, active 0, maxActive 5, creating 1
对于执行中的SQL会存在执行超时
com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request

1.9数据库挂机

将mysql的进程kill掉
om.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

1.10隔离级别读已提交

在这里插入图片描述
A的事物传播属性及隔离级别为
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED)

1.11update结果集返回记录数

全表更新
int i = baseDao.dbUpdate("UPDATE t5 set name=‘lisi’ ");
全表更新 返回值为t5表的所有记录条数,比如t5表有4条记录返回4

根据条件更新

int i = baseDao.dbUpdate(“UPDATE t5 set name=‘lisi’ where name=‘wangwu’”);
返回结果为符合条件记录条数,如上图所示 返回2条记录条数

1.12Connection关闭抛异常

当程序获取了连接后,在mysql把这个连接进程杀死后,程序执行时会发现statement已经关闭了 会抛出如下异常
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed.

1.13提交时出现异常

MySQLNonTransientConnectionException

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Communications link failure during commit(). Transaction resolution unknown.
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
 at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
 at com.mysql.jdbc.Util.getInstance(Util.java:383)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1023)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928)
 at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1748)
 at mysql.commint.MysqlCommitTest.test01(MysqlCommitTest.java:28)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:483)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
 at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
 at org.junit.runners.ParentRunner.runChi

1.14 8小时未连接再连接出异常

com.
mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 53,543,269 milliseconds ago…
在这里插入图片描述

2 ORACLE

2.1测试环境

应用程序
基于spring+nutz的技术框架:
lightcore-launcher-common, lightcore-launcher-service
数据源为DFDB 1.0.2

oracle环境
oracle11g+redhat6.5 在vmware环境

2.2主键冲突异常或唯一性索引异常

当主键发生冲突 或 某个字段加上唯一性索引后发生唯一性冲突时会报如下异常
java.sql.SQLIntegrityConstraintViolationException: ORA-00001
另外:
spring+mybatis框架下主键冲突或唯一性索引后 mybatis会封装后报如下异常
org.apache.ibatis.exceptions.PersistenceException

2.3Query查询超时Update锁超时

查询超时场景测试说明
1.在dfdf的 PhysicalDataSources.xml 设置了queryTimeout 超时时间
2.执行一个 select * from t1,t2,t3 --其中t1,t2,t3分别存放10W条数据 查询时会超时
更新超时场景测试说明
3. 在一个应用中debug模式下开启一个事物,执行更新(或select for update)打上断点后不提交
4. 另一个应用程序也更新这条记录 触发应用程序的更新超时

以下两种场景都会报如下异常
Caused by : java.sql.SQLException: ORA-01013: 用户请求取消当前的操作
其中update超时后 最终更新语句不会触发数据库的修改

2.4网络断开

应用程序正在执行SQL操作时,将网卡禁用掉 模拟出网络断开场景

java.sql.SQLRecoverableException: IO 错误: Software caused connection abort: recv failed

2.5网络阻塞

在vmware的网络适匹器中设置 kbps带宽比较小 造成网络阻塞

此时 会报两种异常
已经存在的应用连接 会报
java.sql.SQLException: ORA-01013: 用户请求取消当前的操作
对于新创建的连接会报

2.6网络丢包

java.sql.SQLRecoverableException: IO 错误: Socket read timed out

2.7网络延时

新建的连接会报
com.alibaba.druid.pool.GetConnectionTimeoutException
已经存在的连接会报
java.sql.SQLException: ORA-01013: 用户请求取消当前的操作

2.8数据库CPU飙高

com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10001, active 0, maxActive 5, creating 1
或者已执行的SQL会报这个异常
Caused by : java.sql.SQLException: ORA-01013: 用户请求取消当前的操作

2.9数据库的oracle服务shutdown

在数据库执行 SQL>shutdown immediate 即立即关闭数据库服务时
java.sql.SQLRecoverableException: ORA-01089: immediate shutdown in progress - no operations are permitted
具体的异常信息文件

2.10Kill掉oracle的部分进程

java.sql.SQLRecoverableException: 无法从套接字读取更多的数据

2.11隔离级别读已提交

name=zhangsan 初始值
A B
开启事物 开启事物
读取name结果为zhangsan …
  修改name=lisi
读取name结果为zhangsan …
  提交事物
读取name结果为lisi  
提交事物

A的事物传播属性及隔离级别为
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED)

2.12update结果集返回记录数

全表更新
int i = baseDao.dbUpdate("UPDATE t5 set name=‘lisi’ ");
全表更新 返回值为t5表的所有记录条数,比如t5表有4条记录返回4

根据条件更新

int i = baseDao.dbUpdate(“UPDATE t5 set name=‘lisi’ where name=‘wangwu’”);
返回结果为符合条件记录条数,如上图所示 返回2条记录条数

3 DB2

3.1测试环境

应用程序
基于spring+nutz的技术框架:
lightcore-launcher-common, lightcore-launcher-service
数据源为DFDB 1.0.2

db2环境
db2v10.5.0.10

3.2主键冲突异常

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;DB2INST1.TEST,DRIVER=3.64.82

3.3Query查询超时Update锁超时

查询超时场景测试说明
1.在dfdf的 PhysicalDataSources.xml 设置了queryTimeout 超时时间
2.执行一个 select * from t1,t2,t3 --其中t1,t2,t3分别存放10W条数据 查询时会超时
更新超时场景测试说明
5. 在debug模式下开启一个事物 打上断点后不提交
6. 另一个应用程序也更新这条记录 触发应用程序的更新超时

以下两种场景都会报如下异常
com.ibm.db2.jcc.am.SqlException: DB2 SQL Error: SQLCODE=-952,SQLSTATE=57014,SQLERRMC=null,driver=3.64.82

事务超时验证

事务超时这个验证的最后结论是

1.事务超时时间 对jdbcTemplate和mybatis 都生效
2.事务超时时间是指从开始 到操作数据库statement的时间 在这段时间范围内完成操作数据库即可,否则会报事务超时
3.事务超时间范围的计算结束点 是指操作数据库的时间,并不是方法体结束的时间点
比如事务超时时间为3s
doTxA{
第一步 插入流水库1s
第二步 开始写文件 耗时7s
}
整体操作doTxA会正常执行 耗时 8s ,这时不会报超时,因为超时结束点的计算以入库的时间计算,并不是按方法的结束作为结束点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值