首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

JDBC批量Insert深度优化(有事宜)(转)

2012-08-25 
JDBC批量Insert深度优化(有事务)(转)环境:MySQL 5.1RedHat Linux AS 5JavaSE 1.5DbConnectionBroker 微型

JDBC批量Insert深度优化(有事务)(转)
环境:MySQL 5.1RedHat Linux AS 5JavaSE 1.5DbConnectionBroker 微型数据库连接池?测试的方案:执行10万次Insert语句,使用不同方式。?A组:静态SQL,自动提交,没事务控制(MyISAM引擎)1、逐条执行10万次2、分批执行将10万分成m批,每批n条,分多种分批方案来执行。?B组:预编译模式SQL,自动提交,没事务控制(MyISAM引擎)1、逐条执行10万次2、分批执行将10万分成m批,每批n条,分多种分批方案来执行。-------------------------------------------------------C组:静态SQL,不自动提交,有事务控制(InnoDB引擎)1、逐条执行10万次2、分批执行将10万分成m批,每批n条,分多种分批方案来执行。?D组:预编译模式SQL,不自动提交,有事务控制(InnoDB引擎)1、逐条执行10万次2、分批执行将10万分成m批,每批n条,分多种分批方案来执行。?本次主要测试C、D组,并得出测试结果。?SQL代码DROP?测试结果意想不到吧,最短时间竟然超过上篇。观察整个测试结果,发现总时间很长,原因是逐条执行的效率太低了。?结论:?在本测试条件下,得出结论:?数据库连接池控制下,不自动提交,事务控制(InnoDB引擎)?1、逐条执行的效率很低很低,尽可能避免逐条执行。2、事务控制下,静态SQL的效率超过预处理SQL。3、分批的大小对效率影响挺大的,一般来说,事务控制下,分批大小在100-1000之间比较合适。4、谈到优化方式,上面的批处理就是很好的优化策略。??大总结:?对比上篇没事务的测试结果,得出一个全面的结论:?1、连接池最基本的也是最重要的优化策略,总能大幅提高性能。?2、批处理在效率上总是比逐条处理有优势,要处理的数据的记录条数越大,批处理的优势越明显,批处理还有一个好处就是减少了对数据库的链接次数,从而减轻数据库的压力。?3、批处理执行SQL的时候,批处理的分批的大小与数据库的吞吐量以及硬件配置有很大关系,需要通过测试找到最佳的分批大小,一般在50-1000之间。?4、预处理SQL在没事务的表上效率较高,在有实物的情况下比静态SQL稍有不及。但预定义SQL还有个好处就是消耗的内存较少,静态SQL串会占用大量的内存资源,容易导致内存溢出的问题。因此批量执行时候可以优先选择预定义SQL。?5、在批处理执行的时候,每批执行完成后,最好显式的调用pstmt.close()或stmt.close()方法,以便尽快释放执行过的SQL语句,提高内存利用率。?6、对于有大量SELECT操作,MyISAM是更好的选择;对于有大量INSERT和UPDATE操作的表,InnoDB效率更好。?7、虽然测试结果只能反映特定情况下的一些事实,以上的优化策略是普遍策略,可以明显缩短寻找最优策略的时间,对于效率要求很高的程序,还应该做并发性等测试。?8、测试是件很辛苦的事情,你需要有大量的事实来证明你的优化是有效的,而不能单单凭经验,因为每个机器的环境都不一样,使用的方式也不同。?

本文出自 “熔 岩” 博客,转载请与作者联系!

热点排行