锁定老帖子 主题:Java 批量插入数据库(MySQL)数据
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-29
实现Java批量插入数据库数据,在javaeye中看到过几篇关于实现Java批量插入数据库数据,转载时没有找到,就自己写一下,也算是对自己学习过程中所遇到过的问题做一个总结。 一般关于批量向数据库插入数据都采用PreparedStatement、Statement…………也包括直接使用JDBC API、框架………… 也看到过几篇关于这些内容的总结,及大家的评论,以下为我总结的关于批量向数据库插入数据。
1,使用JDBC API实现配量插入数据:有篇文章介绍过关于JDBC API、Hibernate实现批量插入数据,采用JDBC API 方式实现随着数据的增长,速度更胜于Hibernate。当然,对于这个测试的准确我并不保证,但是我也会优先选用JDBC API方式实现(原因:简单、易学、相对于框架更通用,不会过时)。
2,采用PreparedStatement对象实现批量插入数据:PreparedStatement是真正的批处理命令,不是其他的伪批处理命令可以相比的(个人意见),它相对于其他的实现批量处理是非常的强大,比如字段不断改变,每次都要从文件从新读取就只能使用PreparedStatement对象来实现。再有就是存在即合理,既然PreparedStatement对象可以多次高效地执行预编译的语句,就一定有其原因(JDk源码没有分析过,和Statement实现的区别不了解)。
3,实现批量插入数据库数据
Class.forName("com.mysql.jdbc.Driver"); Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://" + "localhost:3306/excel2mysql", "wanle", "wanle"); // 关闭事务自动提交 con.setAutoCommit(false); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS"); TimeZone t = sdf.getTimeZone(); t.setRawOffset(0); sdf.setTimeZone(t); Long startTime = System.currentTimeMillis(); PreparedStatement pst = (PreparedStatement) con.prepareStatement("insert into test04 values (?,'中国')"); for (int i = 0; i < 10000; i++) { pst.setInt(1, i); // 把一个SQL命令加入命令列表 pst.addBatch(); } // 执行批量更新 pst.executeBatch(); // 语句执行完毕,提交本事务 con.commit(); Long endTime = System.currentTimeMillis(); System.out.println("用时:" + sdf.format(new Date(endTime - startTime))); pst.close(); con.close();
插入10000条数据用时3141毫秒,对于我已经很理想了, 毕竟我们不会使用MySQL进行非常大型项目的开发,对于10000条数据3秒多点,已经可以了,我相信对于大家应该也足以应付了,我们不会每天都插入10000条吧,当然对于我的话如果有这样的需求,我不会选择MySQL。
以上所有内容均为对于我所学习使用过程中、实际项目开发中的总结,也应用于其中。对于批量插入,数据导入均采用这样的方式。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-02-13
1w条数据3s搞定?MyISAM吧?
|
|
返回顶楼 | |
发表时间:2009-02-14
ninthbar 写道 1w条数据3s搞定?MyISAM吧? 是的,基本的设置都才用默认的,没有进行过更改…… |
|
返回顶楼 | |
发表时间:2009-02-14
ninthbar 写道 1w条数据3s搞定?MyISAM吧? http://www.builder.com.cn/2008/0218/738280.shtml 在MySQL 5.0里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能,但是我测试发现没有特别明显的提升。 基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了,因为InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多,当然,相应的在my.cnf中的配置也是比较关键的,良好的配置,能够有效的加速你的应用。 如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。 |
|
返回顶楼 | |
发表时间:2009-02-16
InnoDB 看来要好好学习一下 这个引擎了……
|
|
返回顶楼 | |
发表时间:2009-07-29
感觉你的那个插入性能有点低了呢。我用的是oracle数据库,插入的数据需要从文件中读取。文件中的每条记录还需要做下字符串的截取。插入数据是每秒一万条左右。
|
|
返回顶楼 | |
发表时间:2009-07-29
最近在做大批量数据的操作。不知楼主有没有对该方面有过比较深入的研究呢。有资料的话共享下啊。
|
|
返回顶楼 | |
发表时间:2009-08-04
use the command : LOAD DATA~~
|
|
返回顶楼 | |
发表时间:2009-08-14
1w条 不到2s
|
|
返回顶楼 | |
发表时间:2009-08-15
这样的数据只能是死的?
|
|
返回顶楼 | |