Browsed by
分类: Java

达梦等国产数据库错误码适配Spring

达梦等国产数据库错误码适配Spring

背景

项目某需求需要通过程序定时将数据从A系统同步至B、C等系统。数据同步过程中常见的一种错误是是唯一索引冲突(主键或者其它唯一索引),开发中一般直接使用org.springframework.dao.DuplicateKeyException判断冲突是否为唯一索引,如果是则忽略该条数据,但是使用国产达梦数据库后该判断方式失效了,默认返回了dm.jdbc.driver.DMExceptio

整体伪代码

String sql="insert into TABLE(EMPLOYEEID, EMPLOYEENAME, IDENTITYCARD) values(?,?,?)";List params = new ArrayList();try {for(int i=0;i<1000;i++){Object param[]={"001", "adaivskenan", "140000202201018888"};params.add(param);}jdbcTemplate.batchUpdate(sql,params);} catch (Exception e) {//判断批量异常,退化为单条处理if(NestedExceptionUtils.getRootCause(e).equals(BatchUpdateException.class)){for(int i=0;i<1000;i++){Object param[]={"001", "adaivskenan", "140000202201018888"};params.add(param);try{jdbcTemplate.update(sql,params);}catch(DuplicateKeyException e){//忽略唯一索引错误}}}

解决办法

在资源目录下放置sql-error-codes.xml文件,增加数据库错误码映射在这里插入图片描述在这里插入图片描述

分析过程

1. DuplicateKeyException产生过程

Spring JDBC模块发生数据库异常时会执

阅读全文 Read More

Java进程的dump文件生成与分析

Java进程的dump文件生成与分析

JavaDum

  Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件

线程Dum

  包含所有线程的

堆Dum

  包含线程Dump,并包含所有堆对

制作JavaDum

JVM参数

-XX:+HeapDumpOnOutOfMemoryError

  指示虚拟机在发生内存不足错误

命令行制作

  在JDK的bin目录下,包含了ja

  • jps:查看本机的Java进程信息

  使用jps查看Java进程ID(PID);Linux下还可以使用ps命令

jpsjps -ljps -vps -ef|grep java
  • jstack:打印线程的栈信息,制作线程Dump。
jstack <进程ID> >> <输出文件>jstack 2316 >> c:\thread.txt## Linux下使用Kill命令制作线程Dump,输出线程Dump到目标Java进程的标准输出kill -quit <进程ID>kill -3 <进程ID>
  • jmap:打印内存映射,制作堆Dum

  使用jm

jmap -dump:format=b,file=<输出文件> <进程ID>
  • jconsole:简易的可视化控制台

阅读全文 Read More