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

JDBC 中的Batch

阅读更多

      在jdbc2.0里增加了批量处理的功能(batch),其允许将多个sql语句作为一个单元送至数据库去执行,这样做可以提高操作效率。

      在操作大量的数据时, 先Prepare一个INSERT语句再多次的执行, 会导致很多次的网络连接. 要减少JDBC的调用次数改善性能, 可以使用PreparedStatement或是Statement 的AddBatch()方法一次性发送多个给数据库(PreparedStatement和Statement 的区别就不说了)

例如:

使用普通的for循环时,效率要低的多

public class testplain {
	public static void main(String[] args) throws Exception {
		Connection conn = getOracleConnection();
		PreparedStatement ps = null;
		try {
			ps = conn
					.prepareStatement("INSERT INTO batchtab employees values (?, ?)");

			conn.setAutoCommit(false);
			for (int n = 1; n < 3; n++) {
				Integer i = new Integer(n);
				ps.setString(1, i.toString());
				ps.setString(2, "value" + i.toString());
				ps.executeUpdate();
			}
			conn.commit();
		}catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("Message: " + ex.getMessage());
			System.out.println("Vendor error code: " + ex.getErrorCode());
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("Exception: " + e.getMessage());
		} finally {
			if (conn != null)
				conn.close();
			if (ps != null)
				ps.close();

		}
	}

	public static Connection getOracleConnection() throws Exception {
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:test";
		String username = "test";
		String password = "test";

		Class.forName(driver); // load Oracle driver
		Connection conn = DriverManager.getConnection(url, username, password);
		return conn;
	}
}

使用batch,将多个sql操作作为一个单元传输给数据库:

public class testbatch {
	public static void main(String[] args) throws Exception {
		Connection conn = getOracleConnection();
		ResultSet rs = null;
//		Statement stmt = null;
		PreparedStatement stmt=null;
		try {
//			 Create a prepared statement
			String sql = "INSERT INTO batchtab employees values (?, ?)";
			stmt = conn.prepareStatement(sql);
			conn.setAutoCommit(false);
			stmt.clearBatch();
//			 Insert 3 rows of data
	        for (int i=0; i<3; i++) {
	            stmt.setString(1, ""+i);
	            stmt.setString(2, "batch_value"+i);
	            stmt.addBatch();
	        }
			int[] updateCounts = stmt.executeBatch();
			System.out.println(updateCounts);
			conn.commit();
			sql="SELECT * FROM batchtab";
			stmt = conn.prepareStatement(sql);
			rs = stmt.executeQuery();
			while (rs.next()) {
				String id = rs.getString("batch_id");
				String name = rs.getString("batch_value");
				System.out.println("id=" + id + "  name=" + name);
			}
		} catch (BatchUpdateException b) {
			System.out.println("SQLException: " + b.getMessage());
			System.out.println("SQLState: " + b.getSQLState());
			System.out.println("Message: " + b.getMessage());
			System.out.println("Vendor error code: " + b.getErrorCode());
			System.out.print("Update counts: ");
			int[] updateCounts = b.getUpdateCounts();
			for (int i = 0; i < updateCounts.length; i++) {
				System.out.print(updateCounts[i] + " ");
			}
		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("Message: " + ex.getMessage());
			System.out.println("Vendor error code: " + ex.getErrorCode());
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("Exception: " + e.getMessage());
		} finally {
			if( conn != null )
			conn.close();
			if(stmt !=null)
			stmt.close();
			if(rs !=null)
			rs.close();	
		}
	}

	public static Connection getOracleConnection() throws Exception {
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:test";
		String username = "test";
		String password = "test";

		Class.forName(driver); // load Oracle driver
		Connection conn = DriverManager.getConnection(url, username, password);
		return conn;
	}
}

  

下面举个例子(使用statement的例子):

public class testbatch {
	public static void main(String[] args) throws Exception {
		Connection conn = getOracleConnection();
		ResultSet rs = null;
		Statement stmt = null;
		try {

			stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
					ResultSet.CONCUR_UPDATABLE);
			conn.setAutoCommit(false);
			stmt.clearBatch();
			stmt.addBatch("INSERT INTO batchtab(batch_id, batch_value) VALUES('1', 'batch_value1')");
			stmt.addBatch("INSERT INTO batchtab(batch_id, batch_value) VALUES('2', 'batch_value2')");
			stmt.addBatch("INSERT INTO batchtab(batch_id, batch_value) VALUES('3', 'batch_value3')");
			int[] updateCounts = stmt.executeBatch();
			System.out.println(updateCounts);
			conn.commit();
			rs = stmt.executeQuery("SELECT * FROM batchtab");
			while (rs.next()) {
				String id = rs.getString("batch_id");
				String name = rs.getString("batch_value");
				System.out.println("id=" + id + "  name=" + name);
			}
		} catch (BatchUpdateException b) {
			System.out.println("SQLException: " + b.getMessage());
			System.out.println("SQLState: " + b.getSQLState());
			System.out.println("Message: " + b.getMessage());
			System.out.println("Vendor error code: " + b.getErrorCode());
			System.out.print("Update counts: ");
			int[] updateCounts = b.getUpdateCounts();
			for (int i = 0; i < updateCounts.length; i++) {
				System.out.print(updateCounts[i] + " ");
			}
		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("Message: " + ex.getMessage());
			System.out.println("Vendor error code: " + ex.getErrorCode());
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("Exception: " + e.getMessage());
		} finally {
			if( conn != null )
			conn.close();
			if(stmt !=null)
			stmt.close();
			if(rs !=null)
			rs.close();	
		}
	}

	public static Connection getOracleConnection() throws Exception {
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:testbatch";
		String username = "test";
		String password = "test";

		Class.forName(driver); // load Oracle driver
		Connection conn = DriverManager.getConnection(url, username, password);
		return conn;
	}
}

 

 

分享到:
评论

相关推荐

    hibernate-batch-size-test:Hibernate hibernate.jdbc.batch_size 测试

    `hibernate.jdbc.batch_size`是Hibernate配置中的一个重要参数,用于控制批处理操作的大小。本文将深入探讨这个参数的意义、作用以及如何在实际应用中进行测试。 批量插入是提高数据库性能的有效手段,特别是在大量...

    优化Hibernate性能的几点建议

    此外,还可以通过分析Hibernate的性能指标来调整诸如`hibernate.jdbc.batch_size`等参数,以达到最佳性能平衡。 总之,通过上述几个方面的优化措施,可以显著提高基于Hibernate构建的应用程序的性能。在实际应用中...

    jdbc jdbc jdbc

    6. **批处理(Batch Processing)**:对于需要执行大量相似SQL语句的情况,JDBC提供批处理功能,允许一次发送多个SQL语句,从而提高效率。 7. **JDBC URL**:每个数据库驱动都有一个特定的JDBC URL格式,用于标识要...

    jdbc2000,jdbc2005

    Java Database Connectivity(JDBC)是Java编程语言中用于与各种数据库进行交互的一组接口和类。JDBC2000和JDBC2005分别指的是在2000年和2005年时期的JDBC规范版本。这两个版本都是在Java数据库连接技术的发展历程中...

    JDBCJDBC高级应用

    JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一种接口。在JDBC高级应用中,我们可以利用其提供的功能实现更高效、更灵活的数据操作。以下是一些关键知识点: 1. **元数据获取**...

    Dm7JdbcDriver16.jar Dm7JdbcDriver17.jar Dm7JdbcDriver18.jar

    在给定的压缩包文件中,包含了三个不同版本的达梦JDBC驱动,分别是Dm7JdbcDriver16.jar、Dm7JdbcDriver17.jar和Dm7JdbcDriver18.jar。 1. **JDBC驱动介绍**: JDBC是Java中用于与各种数据库进行交互的标准接口,它...

    JDBC:MySQL8.0.29驱动

    JDBC(Java Database Connectivity)是Java编程语言中用于与关系数据库交互的一种标准接口。它是Java平台的标准部分,允许开发人员使用SQL语言在Java应用程序中执行数据库操作。MySQL JDBC驱动,也称为MySQL ...

    SqlJDBC3.0和4.0

    Java Database Connectivity(JDBC)是Java编程语言中用于访问数据库的标准应用编程接口(API)。JDBC3.0和JDBC4.0是两个重要的版本,它们在连接Java应用程序与Microsoft SQL Server 2005(对应JDBC3.0)和SQL ...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    在数据库操作中,批量插入(Batch Insert)是一种提高性能的有效方式,尤其是在处理大量数据时。本文将探讨Mybatis和JDBC在批量插入MySQL数据库时的性能差异,并提供相关的测试资源。 首先,JDBC(Java Database ...

    JDBC数据库

    Java Database Connectivity (JDBC) 是Java编程语言中用于标准地连接和操作各种类型数据库的接口。它是Java平台的标准API,允许Java应用程序与各种关系型数据库进行交互。JDBC提供了一套规范,使得开发人员可以使用...

    impala_jdbc驱动包

    2. JDBC4:随着Java版本的更新,JDBC4在Java SE 5和6中引入,它扩展了JDBC3的功能,引入了更多的自动类型转换、连接池管理和异常处理机制,使得数据库操作更加便捷。 3. JDBC41:这个版本是在Java SE 7中引入的,...

    Spring JDBC相关jar包:spring_jdbc_4.0.0.zip

    在这个“spring_jdbc_4.0.0.zip”压缩包中,包含的是Spring JDBC 4.0.0版本的jar文件,即“spring-jdbc-4.0.0.jar”。 在Spring JDBC中,最重要的概念是`JdbcTemplate`。这是一个非常实用的工具类,它通过模板方法...

    Spring Batch批处理框架

    Spring Batch支持多种数据源和持久化方式,包括关系型数据库和JDBC。它使用JobRepository来存储作业的元数据,包括作业执行的记录和统计信息。JobRepository是作业持久化的核心,提供了多种操作和查询方法来管理作业...

    javajdbc宠物商店-Mysql数据库_Java项目jdbc_java宠物项目_数据库代码_

    9. **性能优化**: 通过批处理(Batch Processing)、连接池(Connection Pooling)和使用预编译的SQL(PreparedStatement)等方式,可以显著提升JDBC应用的性能。 10. **数据库连接关闭**: 在完成数据库操作后,应...

    jdbc.rar_jdbc_jdbc系统

    总的来说,【jdbc.rar_jdbc_jdbc系统】提供的资源对于学习和理解如何在实际项目中运用JDBC技术具有很高的价值。通过研究这个系统的代码,我们可以深入理解JDBC的工作原理,掌握数据库操作的最佳实践,并提升我们的...

    Spring+JDBC实例

    当我们谈论"Spring+JDBC实例"时,通常是指在Spring框架中使用JDBC进行数据访问的方式,这种方式可以利用Spring提供的便利性,同时保留对数据库的直接控制。 在Spring框架中,JDBC操作被封装在`org.springframework....

    oracle_jdbc_讲义例子

    此外,对于大数据量处理,JDBC批处理(Batch Processing)是一个重要的优化手段。通过`addBatch()`和`executeBatch()`方法,可以一次性发送多个SQL语句,减少网络往返次数,提高性能。 在源码分析部分,可能会深入...

    优化JDBC方法功略

    2. 选用最佳性能的功能:了解并利用JDBC驱动提供的特性,比如批处理(Batch Updates),它可以显著提高插入、更新和删除操作的速度。 3. 管理连接和更新:有效地管理数据库连接,使用连接池可以减少连接创建和销毁...

    sqljdbc.zip

    此外,JDBC驱动还支持预编译的SQL语句(PreparedStatement),批量操作(Batch Updates),以及更高级的功能如存储过程调用,事务控制等。 在开发过程中,确保使用与你的Java环境和SQL Server版本兼容的驱动版本,...

    异常处理和JDBC

    5. **简化数据库操作**:JDBC提供了一些高级功能,如批处理(batch processing),可以一次性执行多个SQL语句,提高性能。此外,JDBC还支持事务处理,确保一组数据库操作要么全部成功,要么全部失败。 6. **静态和...

Global site tag (gtag.js) - Google Analytics