Java使用jdbc数据库批量插入、查询 setFetchSize

本文介绍使用PreparedStatement的executeBatch()方法批量插入数据到数据库的方法,通过关闭自动提交减少交互次数,提高效率,并讨论了查询时如何设置fetchSize来优化查询性能。
将大批量数据插入到 数据库 中,用preparedstatement.executeBatch();来做,
这样可以减少与 数据库 间的交互,
不仅仅只是单纯用addBatch()和executeBatch()就行了,还需要将conn.setAutoCommit(false),
这样关闭自动事务提交,也可以减少交互。
还需注意addBatch()到一定次数是要及时提交,否则容易发生内存溢满的问题。
try {
   String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SID
   String user = "oracle";
   String password = "oracle";
   StringBuffer sql = new StringBuffer();
   sql.append("insert into ex_log (EX_LOG_ID,EX_LOG_DATE) values (?,?)");
   Class.forName("oracle.jdbc.driver.OracleDriver");
   Connection con = (Connection) DriverManager.getConnection(url,user,password);
   // 关闭事务自动提交
   con.setAutoCommit(false);
   final int batchSize = 10000;
   int count = 0;
   Long startTime = System.currentTimeMillis();
   PreparedStatement pst = (PreparedStatement) con.prepareStatement(sql.toString());
   for (int i = 0; i < list.size(); i++) {
    ExLog exLog = (ExLog)list.get(i);
    pst.setString(1, exLog.getExLogId());
    pst.setString(2, exLog.getExLogDate());
    // 把一个SQL命令加入命令列表
    pst.addBatch();
    if(++count % batchSize == 0 ){
        pst.executeBatch();
        count = 0;
    }
   }
   // 执行批量更新
   pst.executeBatch();
   // 语句执行完毕,提交本事务
   con.commit();
   Long endTime = System.currentTimeMillis();
   System.out.println("用时:" + (endTime - startTime));
   pst.close();
   con.close();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   e.printStackTrace();
  }

 

查询:

    @Test
    public void testReadTimeout() throws SQLException {
        Connection connection = dataSource.getConnection();
        //https://jdbc.postgresql.org/documentation/head/query.html
        connection.setAutoCommit(false); //NOTE 为了设置fetchSize,必须设置为false

        String sql = "select * from demo_table";
        PreparedStatement pstmt;
        try {
            pstmt = (PreparedStatement)connection.prepareStatement(sql);
            pstmt.setFetchSize(50); 
            System.out.println("ps.getQueryTimeout():" + pstmt.getQueryTimeout());
            System.out.println("ps.getFetchSize():" + pstmt.getFetchSize());
            System.out.println("ps.getFetchDirection():" + pstmt.getFetchDirection());
            System.out.println("ps.getMaxFieldSize():" + pstmt.getMaxFieldSize());

            ResultSet rs = pstmt.executeQuery(); 
            //NOTE 这里返回了就代表statement执行完成,默认返回fetchSize的数据
            int col = rs.getMetaData().getColumnCount();
            System.out.println("============================");
            while (rs.next()) { 
                for (int i = 1; i <= col; i++) {
                    System.out.print(rs.getObject(i));
                }
                System.out.println("");
            }
            System.out.println("============================");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //close resources
        }
    }

参考:https://www.jianshu.com/p/998099e364b2

https://blog.youkuaiyun.com/zhangw1236/article/details/54583192

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值