`
lixiamani
  • 浏览: 37359 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC addbatch批量处理数据时有最大值限制

阅读更多
在用jdbc向数据灌入数据时,发现120000的数据每次只能灌入50000多条,其他的就没有了。
在oracle 9i(windows 2003),oracle 10g(RHEL 4)上试验证有相同的结果。

使用定量灌入的办法,每5W条定义为一个事务,进行提交,将120000数据循环灌入,成功。
对于批量的update,delete操作两样有5W条左右的记录数限制。
结论:jdbc批量数据处理的每个批次是有数量的限制的。
我在本地环境中测试的限制量为每批54464条,其他配置的机器没有试过。

以下是插入数据时的代码:


ConnDB cd = new ConnDB();   
        Connection ct = null;   
        PreparedStatement pst = null;   
        ResultSet rs = null;   
  
        ct = cd.getConn();   
  
        String insertSql = "insert into mytable (name,age) values(?,?)";   
  
        System.out.println(insertSql);   
        try {      
            ct.setAutoCommit(false); // 开始事务   
            pst = ct.prepareStatement(insertSql);      
            for (int i = 0; i < 120000; i++) {   
               
                pst.setString(1, "name" + i);   
                pst.setInt(2, i);   
                pst.addBatch();   
                   
                System.out.println(i);   
                //分段提交   
                if((i%50000==0&& i!=0)||i== (120000 -1)){   
                    pst.executeBatch();   
                    ct.commit();   
                    ct.setAutoCommit(false);// 开始事务   
                    pst = ct.prepareStatement(insertSql);   
                    System.out.println("------------>50000");   
                }   
                   
            }   
            ct.commit();// 提交事务   
  
               
  
  
        } catch (SQLException e) {   
  
            try {   
                ct.rollback();   
            } catch (SQLException e1) {   
  
                e1.printStackTrace();   
            }   
            e.printStackTrace();   
        } catch (RuntimeException e) {   
            try {   
                ct.rollback();   
            } catch (SQLException e1) {   
  
                e1.printStackTrace();   
            }   
  
        } finally {   
          cd.close(ct, pst, rs);   
        }   
           
    }  

ConnDB cd = new ConnDB();
		Connection ct = null;
		PreparedStatement pst = null;
		ResultSet rs = null;

		ct = cd.getConn();

		String insertSql = "insert into mytable (name,age) values(?,?)";

		System.out.println(insertSql);
		try {	
			ct.setAutoCommit(false); // 开始事务
			pst = ct.prepareStatement(insertSql);	
			for (int i = 0; i < 120000; i++) {
			
				pst.setString(1, "name" + i);
				pst.setInt(2, i);
				pst.addBatch();
				
				System.out.println(i);
				//分段提交
				if((i%50000==0&& i!=0)||i== (120000 -1)){
					pst.executeBatch();
					ct.commit();
					ct.setAutoCommit(false);// 开始事务
					pst = ct.prepareStatement(insertSql);
					System.out.println("------------>50000");
				}
				
			}
			ct.commit();// 提交事务

			


		} catch (SQLException e) {

			try {
				ct.rollback();
			} catch (SQLException e1) {

				e1.printStackTrace();
			}
			e.printStackTrace();
		} catch (RuntimeException e) {
			try {
				ct.rollback();
			} catch (SQLException e1) {

				e1.printStackTrace();
			}

		} finally {
          cd.close(ct, pst, rs);
		}
		
	}


以下是删除数据时的代码:


ConnDB cd = new ConnDB();   
Connection ct = null;   
PreparedStatement pst = null;   
ResultSet rs = null;   
  
ct = cd.getConn();   
  
String deleteSql = "delete from mytable t where t.name=?";   
  
System.out.println(deleteSql);   
  
int[] intArray = new int[120000];   
  
try {   
    ct.setAutoCommit(false); // 开始事务   
    pst = ct.prepareStatement(deleteSql);   
    for (int i = 0; i < 120000; i++) {   
  
        pst.setString(1, "name" + i);   
        pst.addBatch();   
  
        System.out.println(i);   
        // 分段提交   
        if ((i % 50000 == 0 && i != 0) || i == (120000 - 1)) {   
            intArray = pst.executeBatch();   
            ct.commit();   
            ct.setAutoCommit(false);// 开始事务   
            pst = ct.prepareStatement(deleteSql);   
            System.out.println("------------>50000");   
  
        }   
  
    }   
  
    ct.commit();// 提交事务   
  
} catch (SQLException e) {   
  
    try {   
        ct.rollback();   
    } catch (SQLException e1) {   
  
        e1.printStackTrace();   
    }   
    e.printStackTrace();   
} catch (RuntimeException e) {   
    try {   
        ct.rollback();   
    } catch (SQLException e1) {   
  
        e1.printStackTrace();   
    }   
  
} finally {   
    cd.close(ct, pst, rs);   
}   

		ConnDB cd = new ConnDB();
		Connection ct = null;
		PreparedStatement pst = null;
		ResultSet rs = null;

		ct = cd.getConn();

		String deleteSql = "delete from mytable t where t.name=?";

		System.out.println(deleteSql);

		int[] intArray = new int[120000];

		try {
			ct.setAutoCommit(false); // 开始事务
			pst = ct.prepareStatement(deleteSql);
			for (int i = 0; i < 120000; i++) {

				pst.setString(1, "name" + i);
				pst.addBatch();

				System.out.println(i);
				// 分段提交
				if ((i % 50000 == 0 && i != 0) || i == (120000 - 1)) {
					intArray = pst.executeBatch();
					ct.commit();
					ct.setAutoCommit(false);// 开始事务
					pst = ct.prepareStatement(deleteSql);
					System.out.println("------------>50000");

				}

			}

			ct.commit();// 提交事务

		} catch (SQLException e) {

			try {
				ct.rollback();
			} catch (SQLException e1) {

				e1.printStackTrace();
			}
			e.printStackTrace();
		} catch (RuntimeException e) {
			try {
				ct.rollback();
			} catch (SQLException e1) {

				e1.printStackTrace();
			}

		} finally {
			cd.close(ct, pst, rs);
		}

	}


以下是更新数据的代码:

ConnDB cd = new ConnDB();   
        Connection ct = null;   
        PreparedStatement pst = null;   
        ResultSet rs = null;   
  
        ct = cd.getConn();   
        String deleteSql = "update  mytable t set t.age =20 where t.name=?";   
  
        System.out.println(deleteSql);   
  
        int[] intArray = new int[120000];   
  
        try {   
            ct.setAutoCommit(false); // 开始事务   
            pst = ct.prepareStatement(deleteSql);   
            for (int i = 0; i < 120000; i++) {   
  
                pst.setString(1, "name"+i);   
                pst.addBatch();   
  
                System.out.println(i);   
                // 分段提交   
                if ((i % 50000 == 0 && i != 0) || i == (120000 - 1)) {   
                    intArray = pst.executeBatch();   
                    ct.commit();   
                    ct.setAutoCommit(false);// 开始事务   
                    pst = ct.prepareStatement(deleteSql);   
                    System.out.println("------------>50000");   
  
                }   
  
            }   
  
            ct.commit();// 提交事务   
  
        } catch (SQLException e) {   
  
            try {   
                ct.rollback();   
            } catch (SQLException e1) {   
  
                e1.printStackTrace();   
            }   
            e.printStackTrace();   
        } catch (RuntimeException e) {   
            try {   
                ct.rollback();   
            } catch (SQLException e1) {   
  
                e1.printStackTrace();   
            }   
  
        } finally {   
            cd.close(ct, pst, rs);   
        }   
  
    }  
分享到:
评论
3 楼 lixiamani 2011-11-21  
一条数据的数据量大小不同,你的数据量比较大
2 楼 cmland 2011-10-27  
我的测试结果和你相差好远,使用batch最多能支持511条记录进行批量操作。
测试环境:jdk1.6,win7,oracle10g。
如果batch数量多于511条就会报错:
java.lang.ArrayIndexOutOfBoundsException: -32433。
1 楼 hslh22 2011-09-01  
请提供一下完整的源代码,谢谢

相关推荐

    jdbc连接数据库的方式2

    因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。  此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。...

    批量处理JDBC语句提高处理速度

    有时候JDBC运行得不够快,这使得有些程序员使用数据库相关的存储过程。作为一个替代方案,可以试试使用Statement 的批量处理特性看看能否同时执行所有的SQL以提高速度。 存储过程的最简单的形式就是包含一系列SQL...

    使用JDBC在MySQL数据库中如何快速批量插入数据

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: void addBatch() throws SQLException Adds a set of ...

    jdbc基础和参考

    找到最大值之后+1赋给要持久化的对象 2.assigned:指派 hibernate不在自动生成主键值,需要你在插入时自己指明 3.hilo:高低值算法,由数据库表提供高值,程序提供低值 value = hi*(max_lo+1)+lo 4.sequences Cat...

    【IT十八掌徐培成】Java基础第23天-03.ppst-addBatch-executeBatch.zip

    【IT十八掌徐培成】Java基础第23天-03.ppst-addBatch-executeBatch.zip

    MySQL数据库

    3. 如果涉及批量执行多条SQL时 使用PreparedStatement执行效率较高 - 如果SQL中没有变量用Statement 有变量用PreparedStatement ###批量操作 - Statement批量操作: statement.addBatch(sql1); statement....

    100万级数据插入测试

    100万级数据插入 总结目前网上的spring batchUpdate方法,和jdbc PreparedStatement的addBatch,及insert的2种插入方式引起的效率差别,我的博客中有说明!

    Hibernate管理Session和批量操作分析

    主要介绍了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量处理数据等的常用技巧及注意事项,具有一定的参考借鉴价值,需要的朋友可以参考下

    Oracle addBatch()用法实例详解

    Oracle addBatch()用法实例详解 PreparedStatement.addbatch()的使用 Statement和PreparedStatement的区别就不多废话了,直接说PreparedStatement最重要的addbatch()结构的使用. 1.建立链接  Connection ...

    【IT十八掌徐培成】Java基础第23天-03.ppst-addBatch-executeBatch - 副本.zip

    【IT十八掌徐培成】Java基础第23天-03.ppst-addBatch-executeBatch - 副本.zip

    sql2005 批量更新问题的解决方法

    sm.addBatch(sql1); sm.addBatch(sql2);...可是在数据量比较大的时候,应该会对效率有影响。不建议使用。 PreparedStatement ps = cn.preparedStatement(sql); { ps.setXXX(1,xxx); … ps.addBatch(); } ps.execu

    java面试800题

    Q0060 JDBC批量更新的作用和用法 "提高执行效率。减少执行时间。 Statement sm = cn.createStatement(); sm.addBatch(sql1); sm.addBatch(sql2); ... sm.executeBatch() 或者 PreparedStatement ps = ...

    NC开发文档

    有参批量更新 String sql = "update bd_deptdoc set dept_code =„aaa‟ where dept_code=?”; SQLParameter param = new SQLParameter(); //构造参数对象 param.addParam(“bbb”); //添加参数 session.addBatch...

    java的轻量级orm工具包jdao.zip

    jdao有支持事务,支持批量插入数据等特性。同时jdao底层数据库操作提供接口,编程人员可以自己实现。 如果你觉得hibernate,ibatis等orm框架过于笨重,不烦试下jdao,它可以在团队开发中规范团队持久层代码,较少...

    MongoUtils工具类实现

    封装mong关联查询api接口,如addBatch()、delete()、exists()、lookUp()等接口 public void delete(Query query , Object obj , String collectionName){ mongoTemplate.remove(query, obj .getClass(), ...

    誓言:Node.js的异步BDD和连续测试

    有关许可下特定的语言管理权限和限制,请参阅许可。 例子 var vows = require ( 'vows' ) ; // vows does not pollute the assert module namespace by default var assert = vows . assert ; vows . describe ( ...

    火车票管理系统

    //执行批量处理,提交事务 int [] batchNumber=sta.executeBatch(); conn.commit(); //将手动提交模式转换为自动提交模式 conn.setAutoCommit(true); return batchNumber.length; } catch (SQLException e) {...

    servlet+jsp+javaBean开发的网站书店(完整源码)

    pstmt_item.addBatch(); } pstmt_item.executeBatch(); dbUtil.getCon().commit(); } catch (SQLException e) { e.printStackTrace(); try { dbUtil.getCon().rollback(); } catch ...

    servlet制作网站

    stat.addBatch(o.toString()); } stat.executeBatch(); conn.commit(); sign = true; } catch (Exception ex) { conn.rollback(); sign = false; ex.printStackTrace(); } finally { ...

Global site tag (gtag.js) - Google Analytics