zoukankan      html  css  js  c++  java
  • JDBC executeBatch 抛出异常停止

    进行批量更新的时候发现:

    addBatch(sql);

    executeBatch 抛出异常后,剩余的sql没有更新,即出现异常之前的都入库了,异常之后即使有可执行sql都不会执行。

    百度资料后了解:这是DBMS数据库管理系统控制的,有的DBMS在异常之后,剩下的sql也会执行,有的DBMS异常之后其余的不入库。

    我的改进方法如下:public static boolean bachInsertData(List<String> sqlList) {  boolean bool = false;  Connection conn = null;

    public static boolean bachInsertData(List<String> sqlList) {
            boolean bool = false;
            Connection conn = null;
            Statement stm = null;
            try {
                conn = MyDAO.getConnection();
                conn.setAutoCommit(false);
                stm = conn.createStatement();
                for (String sql : sqlList) {
                    stm.addBatch(sql);
                }
                stm.executeBatch();
                conn.commit();
                bool = true;
            } catch (Exception e) {
                if(e instanceof BatchUpdateException){
                    BatchUpdateException bException = (BatchUpdateException)e;
                    int[] s = bException.getUpdateCounts();
                    logger.info("更新失败数据:"+sqlList.get(s.length));
                    if(s.length+1<sqlList.size()){                    
                        List<String> sList = sqlList.subList(s.length+1, sqlList.size());                    
                        bachInsertData(sList);
                    }
                }else{
                    e.printStackTrace();
                    try {
                        if (stm != null)
                            stm.close();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                    try {
                        conn.close();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }            
            } finally {
                try {
                    if (stm != null)
                        stm.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            return bool;
        }

      以前不知道哇啊啊啊啊,好多得改!!!

  • 相关阅读:
    Android_SQLite标准版
    AutoMapper
    ext.net实例
    Winform Ribbon开发
    数据仓库建设之《元数据管理》
    数据仓库建设之维度建模
    数据仓库建设之总方案
    一点感想
    详细探秘Linux 和 Window 双系统访问Windows 磁盘需要输入密码问题解决过程分析
    如何把数据放到C#的心里之 DB2实例
  • 原文地址:https://www.cnblogs.com/luoyanli/p/3858120.html
Copyright © 2011-2022 走看看