`
wjjxf
  • 浏览: 237811 次
  • 性别: 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
分享到:
评论

相关推荐

    jdbc连接数据库的方式2

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

    R2高性能数据库连接池v1.8改进版源码

    v1.7对池中返回的所有链接做了默认setAutoCommint(true)设置。 v1.6增加了一个配置项(类似于proxool的最大连接使用时间),当一个连接的使用时间超过这个配置后将被自动回收,改连接内的内容将被自动回滚。 v1.5将...

    R2高性能数据库连接池v1.8源码

    v1.7对池中返回的所有链接做了默认setAutoCommint(true)设置。 v1.6增加了一个配置项(类似于proxool的最大连接使用时间),当一个连接的使用时间超过这个配置后将被自动回收,改连接内的内容将被自动回滚。 v1.5将...

    应用服务器中间件技术要求.doc

    " " "支持对异构数据库之间两阶段提交交易处理。 " " "在服务器、程序发生故障的情况下,应用中间件必须保" " "证业务的持续运行,保证交易的完整性。 " " "提供内置的JMS服务,支持将TongLINK/Q、MQ " " "Series等...

    Java数据库编程宝典2

    8.5 使用索引来提高SQL查询的性能 8.6 视图 8.7 小结 第9章 连接和组合查询 9.1 连接表 9.1.1 连接的类型 9.2 键 9.2.1 主键 9.2.2 外键 9.3 使用内连接 9.3.1 使用等连接 9.3.2 使用非等连接 9.4 ...

    Java数据库编程宝典4

    8.5 使用索引来提高SQL查询的性能 8.6 视图 8.7 小结 第9章 连接和组合查询 9.1 连接表 9.1.1 连接的类型 9.2 键 9.2.1 主键 9.2.2 外键 9.3 使用内连接 9.3.1 使用等连接 9.3.2 使用非等连接 9.4 ...

    Java数据库编程宝典1

    8.5 使用索引来提高SQL查询的性能 8.6 视图 8.7 小结 第9章 连接和组合查询 9.1 连接表 9.1.1 连接的类型 9.2 键 9.2.1 主键 9.2.2 外键 9.3 使用内连接 9.3.1 使用等连接 9.3.2 使用非等连接 9.4 ...

    Java数据库编程宝典3

    8.5 使用索引来提高SQL查询的性能 8.6 视图 8.7 小结 第9章 连接和组合查询 9.1 连接表 9.1.1 连接的类型 9.2 键 9.2.1 主键 9.2.2 外键 9.3 使用内连接 9.3.1 使用等连接 9.3.2 使用非等连接 9.4 ...

    Spring面试题

    用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将...

    ibatis 开发指南(pdf)

    程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执 行。 大多数情况下( 特别是对新项目,新系统的开发而言) ,这样的机制无往不利...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    管理员进入登录后,可对帐户进行管理,包括添加管理员帐户、修改管理员帐户、删除管理员帐户和对帐户进行权限设置。 博客用户通过前台登录后,可对自己的博客空间进行管理,包括发布自己的网络日志、收藏个人图片...

    MySQL 5.1中文手冊

    13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 ...

    PFJDBC Driver-开源

    任何 JDBC 驱动程序的包装器,它纠正了程序员在开发过程中犯的一些常见错误,还提供了 SQL 执行时间信息。 提示:缓存、自动提交、ISO 级别、TX、STMTS 等的性能报告。

    Linkis-其他

    Linkis是一个打通了多个计算存储引擎如:Spark、TiSpark、Hive、Python和HBase等,对外提供统一REST/WebSocket/JDBC接口,提交执行SQL、Pyspark、HiveQL、Scala等脚本的计算中间件。 Linkis基于微服务架构,提供了...

    iBATIS实战

    7.4.2 开始、提交以及结束事务 124 7.4.3 我是否需要全局事务 124 7.5 定制事务 125 7.6 事务划界 126 7.6.1 将事务在表现层划界 128 7.6.2 将事务在持久层划界 128 7.6.3 将事务在业务逻辑层划界 128 7.7 小结 129 ...

    MYSQL中文手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL...

    数据库系统-招标参数---模板.doc

    具有多种复制功能模块 " " " "支持ODBC 3.0、X/Open XA、CLI、JDBC等标准 " " " "支持分布式事务及两阶段提交功能 " " " "支持动态将锁粒度调整到合适的级别,支持动态行" " " "级锁定 " " " "支持高可用性组,可以...

    Hibernate实战(第2版 中文高清版)

     10.3.1 揭开自动提交的神秘面纱   10.3.2 使用Hibernate非事务地工作   10.3.3 使用JTA的可选事务   10.4 小结   第11章 实现对话   11.1 传播Hibernate Session   11.1.1 Session传播的用例   ...

    java面试题

    DOM:处理大型文件时性能下降的非常厉害,适合对xml的随机访问 SAX:事件驱动型的xml解析方法,适合对xml的顺序访问 jsp常用动作? 答:jsp:include 引入一个文件 jsp:useBean 实例化JavaBean jsp:setProperty ...

    测试培训教材

    是否需要实现自动化: 自动化实现“Cruise Search”测试用例: 定位到“Cruise Search”测试用例,在“设计步骤”界面中选择“生成脚本-&gt;QUICKTEST_TEST” 需要“Launching Quick Test Professional”来...

Global site tag (gtag.js) - Google Analytics