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

conn.setAutoCommit(false);
		Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
				ResultSet.CONCUR_READ_ONLY);
		for (int x = 0; x < size; x++) {
			stmt
					.execute("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");
		}
		conn.commit();

 JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等。
我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试

  • 方法一,使用PreparedStatement加批量的方法

 

try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(o_url, userName, password);
			conn.setAutoCommit(false);
			String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,object_id) VALUES(?,?,?,?,?)";
			PreparedStatement prest = conn
					.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
							ResultSet.CONCUR_READ_ONLY);
			for (int x = 0; x < size; x++) {
				prest.setString(1, "192.168.1.1");
				prest.setString(2, "localhost");
				prest.setString(3, "20081009");
				prest.setInt(4, 8);
				prest.setString(5, "11111111");
				prest.addBatch();
			}
			prest.executeBatch();
			conn.commit();
			conn.close();
		} catch (SQLException ex) {
			Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null,
					ex);
		} catch (ClassNotFoundException ex) {
			Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null,
					ex);
		}

 

  • 方法二 使用Statement加批量的方法

 

conn.setAutoCommit(false);
		Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
				ResultSet.CONCUR_READ_ONLY);
		for (int x = 0; x < size; x++) {
			stmt
					.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");
		}
		stmt.executeBatch();
		conn.commit();

 

  • 方法三:直接使用Statement

 

  • 使用上述方法分别插入10万条数据的平均测试时间为:
    方法一:17.844s
    方法二:18.421s
    方法三:16.359s

    可以看出JDBC的batch语句插入不但没有性能提升,反而比没有用batch的时候要慢,当然这可能跟JDBC具体驱动的实现方法有关。 附件中是我测试代码,可以用来在自己电脑上跑一下。

    在执行批量插入的时候最主要的是将自动提交取消,这样不管是否用JDBC的batch语法应该都没有关系。
    conn.setAutoCommit(false)
     
     
    自身感受:
    上面的方法是网上能长的3种比较常用的方法,但我在用上面方法的时候都报游标数不足的异常,
    这跟oracle设置没有关系,因为oracle不可能因为这点原因而开到无限大。我是这样解决的:
    用多线程分批插入,每批插入200-300个数据,这样一个线程上的效率上没有什么变化

你可能感兴趣的:(oracle,sql,编程,mysql,jdbc)