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

jdbc是否设置自动提交对性能的影响

阅读更多
项目中DB层会定时向mysql批量提交sql操作,之前是未设置是否自动提交也就是自动提交,性能很差,后来改为手动事务就好了,把一堆sql作为一个事务提交,如果有失败再单个提交。
写了个例子,测试了下性能,发现1000句的更新语句,手动提交事务有300倍的性能提升。
实例代码:
 


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
 
 
 
public class TestDB {
	static Connection conn = getDBConnection("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8&createDatabaseIfNotExist=true&serverTimezone=UTC&useSSL=false",
			"root","root");
	public static Connection getDBConnection(String driver, String urlDB, String user, String pwd)  {
		Connection conn;
		try {
			// 连接MYSQL数据库
			Class.forName(driver);
			conn = DriverManager.getConnection(urlDB, user, pwd);
			return conn;
		} catch (Exception e) { 
			e.printStackTrace();
		}
		
		return null;
	}
	public static void main(String[] args) throws Exception {
		conn.createStatement().execute("CREATE TABLE `test` (  `id` int(11) NOT NULL,  `val` int(11) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
		conn.createStatement().execute("INSERT INTO `test` VALUES (1,1)");
		test3(false, 1000);
		test3(false, 1000);
		test3(true, 1000);
		test4(false, 1000);
		test4(true, 1000);
		test5();
		test6();
		conn.createStatement().execute("DROP TABLE `test` ");
		conn.close();
		System.out.println("test database ok");
	}
	public static void test1() throws Exception{
		long t = System.currentTimeMillis();
		
		Statement  ps = conn.createStatement();
		for(int i = 0;i < 100;i++){
			ps.execute("UPDATE test SET `val`="+(2000+i)+" WHERE id=1");
		}
		ps.close();
		
		long e = System.currentTimeMillis();
		System.out.println("test1 used:"+(e-t));
	}
	public static void test3(boolean autoCommit, int count) throws Exception{
		long t = System.currentTimeMillis();
		conn.setAutoCommit(autoCommit);
		Statement  ps = conn.createStatement();
		for(int i = 0;i < count;i++){
			ps.execute("UPDATE test SET `val`="+(2000+i)+" WHERE id=1");
		}
//		ps.close();
		if(!autoCommit){
			conn.commit();
		}
		long e = System.currentTimeMillis();
		System.out.println("test createStatement , count="+count+" autoCommit="+autoCommit+" used:"+(e-t));
	}
	public static void test4(boolean autoCommit, int count) throws Exception{
		long t = System.currentTimeMillis();
		conn.setAutoCommit(autoCommit);
		PreparedStatement  ps = conn.prepareStatement("UPDATE test SET `val`=? WHERE id=?");
		for(int i = 0;i < count;i++){
			ps.setObject(1, 2000+i);
			ps.setObject(2, 1); 
			ps.execute();
		}
		ps.close();
		if(!autoCommit){
			conn.commit();
		}
		long e = System.currentTimeMillis();
		System.out.println("test prepareStatement, count="+count+", autoCommit="+autoCommit+", used:"+(e-t));
	}
	public static void test5() throws Exception{
		long t = System.currentTimeMillis();
		conn.setAutoCommit(false);
		Statement  ps = conn.createStatement();
		for(int i = 0;i < 1000;i++){
			ps.addBatch("UPDATE test SET `val`="+(2000+i)+" WHERE id=1");
		}
		ps.executeBatch();
		ps.close();
		conn.commit();
		long e = System.currentTimeMillis();
		System.out.println("test5:"+(e-t));
	}
	public static void test6() throws Exception{
		long t = System.currentTimeMillis();
		conn.setAutoCommit(false);
		PreparedStatement  ps = conn.prepareStatement("UPDATE test SET `val`=? WHERE id=?");
		for(int i = 0;i < 1000;i++){
			ps.setObject(1, 2000+i);
			ps.setObject(2, 1); 
			ps.addBatch();
		}
		ps.executeBatch();
		ps.close();
		conn.commit();
		long e = System.currentTimeMillis();
		System.out.println("test6:"+(e-t));
	}
}


执行结果:
引用
test createStatement , count=1000 autoCommit=false used:200
test createStatement , count=1000 autoCommit=false used:150
test createStatement , count=1000 autoCommit=true used:29423
test prepareStatement, count=1000, autoCommit=false, used:199
test prepareStatement, count=1000, autoCommit=true, used:29996
test5:243
test6:167
test database ok
分享到:
评论

相关推荐

    使用sharding-jdbc快速实现自动读写分离-demo源码

    通过这个demo,开发者可以快速了解和实践Sharding-JDBC的读写分离功能,为自己的项目带来更高的性能和扩展性。同时,这也是学习分布式数据库解决方案的一个良好起点,有助于提升对数据库管理和架构设计的理解。

    JDBC性能优化.pdf

    ### JDBC性能优化详解 #### 一、引言 在当今数据密集型的应用环境中,Java数据库连接(JDBC)作为Java应用程序与数据库之间的重要桥梁,其性能优化显得尤为重要。本文将根据“JDBC性能优化.pdf”文件提供的信息,...

    iBATIS3与JDBC性能对比

    在IT行业中,数据库操作是应用开发中的重要环节,而选择合适的访问层技术对于系统的性能有着直接影响。本篇文章将深入探讨iBATIS3和JDBC在性能上的对比,以帮助开发者更好地理解这两种技术的优劣。 iBATIS3是一个轻...

    JDBC事务处理、提交、回滚。.docx

    - **自动提交模式**:默认情况下,JDBC连接处于自动提交模式,每次SQL语句执行后都会自动提交。 - **手动提交模式**:关闭自动提交后,需要程序员显式调用`Connection`对象的`commit()`方法来提交事务,或者在出现...

    jdbc教程_jdbc教程

    5. **关闭自动提交**:在处理事务时,关闭自动提交,手动控制事务提交和回滚。 ### JDBC的安全注意事项 1. **参数绑定**:使用PreparedStatement,避免SQL注入。 2. **安全编码**:对用户输入进行验证和清理,防止...

    使用OracleJDBC的Java编程:性能.docx,原文+译文。

    通过对比开启和关闭自动提交模式下的性能表现,可以得出最佳实践建议。 ##### 2. SQL92语法解析器的影响 SQL92语法解析器的使用也会影响性能。通过比较使用和不使用SQL92语法解析器的情况,可以了解其对执行速度的...

    sqljdbc和sqljdbc4

    **性能优化**:SQLJDBC4还提供了性能优化选项,例如批处理操作,允许一次提交多个SQL语句,减少网络往返次数。还可以调整连接池大小、超时设置等以适应不同的负载需求。 总之,SQLJDBC和SQLJDBC4为Java开发者提供了...

    JDBC事务管理项目

    1. **自动提交模式**:默认情况下,JDBC连接处于自动提交模式,每次SQL语句执行后都会立即提交。这不利于事务处理,因为无法控制何时提交或回滚事务。 2. **手动提交模式**:通过调用`Connection`对象的`...

    sqljdbc42 jdbc for java

    3. 批处理:允许一次性提交多个SQL语句,提高批量操作的性能。 4. 游标支持:提供多种游标类型,使开发者可以选择不同的数据读取模式,提高程序灵活性。 5. 复合主键和外键支持:便于构建复杂的数据库关系模型。 6. ...

    sql server2000 jdbc

    可以通过调用`Connection`对象的`setAutoCommit(false)`来关闭自动提交,然后手动调用`commit()`或`rollback()`来控制事务。 6. **连接池**: 在实际应用中,为了提高性能和资源利用率,通常会使用连接池,如C3P0...

    JDBC事务控制--讲述如何控制JDBC事务

    默认情况下,JDBC 连接处于自动提交模式,这意味着每次执行 SQL 语句后都会自动提交事务。为了控制事务,我们需要关闭自动提交模式,然后手动提交或回滚事务。 1. **关闭自动提交** 使用 `setAutoCommit(false)` ...

    JDBC事物应用源码文件

    默认情况下,JDBC处于自动提交模式,每次SQL语句执行后都会自动提交。要手动控制事务,需要调用`Connection`对象的`setAutoCommit(false)`来禁用自动提交。 3. **开始事务**:在手动提交模式下,可以通过`...

    Dm7JdbcDriver16.jar Dm7JdbcDriver17.jar Dm7JdbcDriver18.jar

    达梦JDBC驱动支持ACID(原子性、一致性、隔离性、持久性)特性,可以进行事务管理和并发控制,比如设置自动提交、手动提交、回滚事务等。 6. **预编译语句与批处理**: 预编译语句(PreparedStatement)可以提高...

    JDBC教程

    通过设置Connection的自动提交属性(`conn.setAutoCommit(false)`)来开启手动事务,并使用`commit()`和`rollback()`方法提交或回滚事务。 ### 5. JDBC批处理 批处理可以提高性能,通过批量执行多条SQL语句。可以...

    jdbc连接数据库的方式2

     值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。  3、在动态SQL或有时间限制的命令中使用Statement对象  在执行SQL命令时,我们...

    JDBC经典练习题

    4. **关闭自动提交**:默认情况下,JDBC连接处于自动提交模式,可通过`conn.setAutoCommit(false)`关闭自动提交,手动管理事务。 5. **使用连接池**:如C3P0、HikariCP等,可以重复利用数据库连接,避免频繁创建和...

    jdbc.rar_java jdbc

    通过Connection对象的`setAutoCommit(false)`关闭自动提交,手动调用`commit()`或`rollback()`。 7. **GUI与JDBC结合**: 在GUI环境中,如Swing或JavaFX,可以使用JDBC连接数据库,将结果显示在表格组件(JTable或...

    SqlJDBC3.0和4.0

    2. **批处理更新(Batch Updates)**:允许一次提交多个SQL语句,提高了性能,减少了网络通信。 3. **结果集分页(Scrollable Result Sets)**:提供了向前和向后滚动的能力,以及定位到特定行的功能。 4. **...

    Jdbc实用教程

    JDBC支持两种事务隔离级别:自动提交和手动提交。默认情况下,每个SQL语句都会在一个单独的事务中执行(自动提交)。若需手动控制事务,可以调用`Connection.setAutoCommit(false)`来开启事务,并在所有操作完成后用...

    JDBC数据库连接JAR包

    - 自动提交:默认情况下,JDBC每条SQL语句都会开启一个事务并自动提交。可通过`Connection.setAutoCommit(false)`关闭自动提交,手动控制事务。 - 显式事务:通过`Connection.commit()`和`Connection.rollback()`...

Global site tag (gtag.js) - Google Analytics