• JDBC的批量插入操作


    在今天之前,当我遇到需要使用JDBC对数据库进行批量插入操作的时候,我使用的方法如下:

    ①使用Connection建立数据库连接;

    ②使用PreparedStatement提交SQL语句,将数据插入;

    ③关闭数据库连接,释放资源。


    但是今晚,我遇到一个问题,需要对MySQL数据库批量插入10000条记录,于是,我将插入操作封装成了一个方法,然后调用,没插入一条记录,都要打开、关闭一次数据库,结果就是,等着一万条记录插入数据库之后,时间居然用了6分半钟。这是不能容忍的,用户不能等待这么久的时间。于是我就寻找JDBC批量插入的方法,参考了一篇博文,地址如下:

    三种JDBC批量插入编程方法的比较


    下面贴出一种方法,并作简要的说明。

    public void batchInsert() {
    		Connection conn = DatabaseUtil.getConnection();
    		PreparedStatement prest = null;
    		try {
    			conn.setAutoCommit(false);
    			String sql = "insert into test values(?,?,?,?,?,?)";
    			prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    			for (int i = 0; i < 10000; i++) {
    				prest.setInt(1, 1);
    				prest.setInt(2, 2);
    				prest.setInt(3, 3);
    				prest.setInt(4, 4);
    				prest.setInt(5, 5);
    				prest.setInt(6, 6);
    				prest.addBatch();
    			}
    			prest.executeBatch();
    			conn.commit();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			DatabaseUtil.close(null, prest, conn);
    		}
    	}

    说明下在建Statement的时候,后面两个参数的意义: 
    第一个参数指定 ResultSet 的类型。其选项有: 
    TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。 
    TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。 
    TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。 
    第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有: 
    CONCUR_READ_ONLY:这是缺省值,指定不可以更新 
    ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet 


    需要说明的一点是,使用批量插入之前,请将JDBC的自动提交取消:

    conn.setAutoCommit(false);


    使用JDBC的批量提交,速度很快,同样是插入10000条记录,时间只用了1.7s


    下面是使用Statement的批量插入:

    public void batchInsert() {
    		Connection conn = DatabaseUtil.getConnection();
    		Statement stmt = null;
    		try {
    			conn.setAutoCommit(false);
    			stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    			for(int i = 0; i < 10000; i++){  
    				   stmt.addBatch("INSERT INTO test VALUES(1,2,3,4,5,6)");  
    				}
    			stmt.executeBatch();
    			conn.commit();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			DatabaseUtil.close(null, stmt, conn);
    		}
    	}


  • 相关阅读:
    谷歌 chrome 和 safari 浏览器 td innerHTML Textbox 部分显示不全
    SQLServer 日期转换字符串格式
    GNU 通用公共授權 第三版
    程序员的十个层次 你属于哪一层?
    一个因为缺少括号()引发的SQL存储过程不能执行的问题。
    关于实现字符串表达式求值
    Windows api数据类型【转载】
    x86—EFLAGS寄存器详解【转载】
    python PIL图像处理
    python学习笔记
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3177630.html
Copyright © 2020-2023  润新知