那些你不知道的 JDBC 异常类型

那些你不知道的 JDBC 异常类型

(1)java.sql.SQLException: connection holder is null
连接超时,主要是 update 或者select 的数据量太大超过,连接持有时间。
解决方式;分片查询 最好 2000以内,查询出来就立刻处理。否则数据量大的时候,会占用很多的JVM内存。
对应配置:主要是数据库连接池的配置, druid 对应removeAbandonedTimeout

(2)com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
同上。
当数据库重启或数据库空闲连接超过设置的最大timemout时间,数据库会强行断开已有的链接,最大timeout时间可以通过命令
在这里插入图片描述

使用数据库连接池的时候,增加连接池的数据库连接超时时间,但是不能超过数据配置的时间。在连接池中配置testOnBorrow,即申请连接的时候先试一试连接是否可用,不过带来的影响就是性能降低,需要根据实际需求合理取舍。

(3)com.mysql.jdbc.PacketTooBigException
主要是批量insert入库的时候,数据量太大导致的,建议分片录入到数据库中,比如 每2000条数据入库一次。
对应mysql的配置参数:这个参数默认是1M。可以临时修改这个值解决问题,最终还是要通修改程序来解决,否则会严重降低系统性能。
在这里插入图片描述

(4)com.mysql.jdbc.exceptions.jdbc4.MySQLDataException
如图:
在这里插入图片描述

常见的情况是通过ORM框架映射到PO的时候,从数据库中查询出的值和java类型不匹配。比如查询出的值超出了PO类中的Integer范围。这时候只能修改PO的字段类型。

(5)org.springframework.jdbc.UncategorizedSQLException
一种情况是并非所有变量都已关联, 就是select * 查询所有字段,但是PO类中,只定义了部分字段。这时需要在 select 中 逐一列出需要的字段,不需要的就不要加了。
还有一种情况是执行关联查询的时候,各个表的编码格式不一致。比如一张表用的是utf8_unicode_ci,另外一张表用的是utf8_general_ci,这时,需要修改表编码格式保持一致。

(6)com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraint ViolationException

一看就是主键冲突,或者违反唯一索引的约束等。需要修改字段生成的逻辑,最好使用自增长的ID做主键,也可以使用 依赖zookeper或redis 主键生产工具。

(7)java.sql.SQLSyntaxErrorException
SQL格式错了,仔细检查下吧。缺少标点,关键词有误等等。。。。

(8)com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
设置 defaultStatementTimeout=“60”
详细解释见:https://segmentfault.com/a/1190000012944562
设置的是一个statement的执行超时时间,即driver等待statement执行完成,接收到数据的超时时间(注意statement的timeout不是整个查询的timeout,只是statement执行完成并拉取fetchSize数据返回的超时,之后resultSet的next在必要的时候还会触发fetch数据,每次fetch的超时时间是单独算的,默认也是以statement设置的timeout为准)

(9)com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollback Exception: Lock wait timeout exceeded
绝大分部原因是出现死锁了。在update的数据的时候,没有利用主键,或者唯一索引,导致锁全表,这时很容易出现死锁。需要修改业务流程,或者给表加上唯一索引,利用唯一索引 update数据。
见https://blog.csdn.net/weixin_41715077/article/details/82982530

猜你喜欢

转载自blog.csdn.net/wenyushu/article/details/90108793