zoukankan      html  css  js  c++  java
  • 关于jdbc编程的几点需要注意的地方

    代码

    private void logDataDb(ArrayList<ReceiveData> datas) {
            Connection conn = null;
            PreparedStatement pstmt = null;
            String sql = "INSERT INTO MON_ALARM_LOG (TIME,TOPIC,DIMENSION,CURRENTVALUE,ALERTMAIL,ALERTPHONE,DESCRIPTION,LEVEL) "
                    + " VALUES(?,?,?,?,?,?,?,?)";
            try {
                conn = DBUtils.getConnection(dbcpPath);
                conn.setAutoCommit(false);
                pstmt = conn.prepareStatement(sql);
                pstmt.clearBatch();
                Iterator<ReceiveData> ite = datas.iterator();
                while (ite.hasNext()) {
                    ReceiveData data = ite.next();
                    pstmt.setTimestamp(1, data.getTime());
                    pstmt.setString(2, data.getTopic());
                    pstmt.setString(3, data.getDimension());
                    pstmt.setDouble(4, data.getValue());
                    pstmt.setString(5, data.getAlertMail());
                    pstmt.setString(6, data.getAlertPhone());
                    pstmt.setString(7, data.getDescription());
                    pstmt.setInt(8, data.getLevel());
                    pstmt.addBatch();
                }
                pstmt.executeBatch();
                conn.commit();
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                LOG.error("保存切片数据出错,MsgAndDbSink.logDataDb()" + e);
            }finally{
                if(pstmt!=null)
                    try {
                        pstmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                if(conn!=null)
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
            }
        }

    1、当一次性需要向数据库插入多条数据时,应该使用jdbc的batch操作。


    2、在使用batch插入的时候,需要将connection的autoCommit设置为false,否则将会影响性能,与逐条插入无异。

    3、在executeBatch()之后,需要进行connection.commit()因为在之前已将autoCommit设为false,需要手工commit。

    4、在最后connection.close()之前,需要将connection的autoCommit设置为其默认的true。

         这是因为对于从连接池获取的connection而言,close()只是将其还给连接池从而达到复用的目的,如果不将autoCommit恢复到默认的true,那么之后该connection被其他

         程序取出使用的时候,将仍然是一个autoCommit=false的链接。 容易引起问题。 且由于连接池的池资源特性,该问题会成为一个不知何时会发生、难以人工重现的问题。

  • 相关阅读:
    CSS3实战手册(第3版)(影印版)
    21世纪C语言(影印版)
    Spring Data:企业级Java的现代数据访问技术(影印版)
    Hive编程(影印版)
    iOS 6编程Cookbook(影印版)
    做自己——鬼脚七自媒体第一季
    放飞App:移动产品经理实战指南
    《推荐系统》+《推荐系统实践》
    步步惊“芯”——软核处理器内部设计分析
    ip的划分,超详细
  • 原文地址:https://www.cnblogs.com/lyhero11/p/5065667.html
Copyright © 2011-2022 走看看