使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:

  1. public void exec(Connection conn){
  2. try {
  3. //开始时间
  4. Long beginTime = System.currentTimeMillis();
  5. //设置手动提交
  6. conn.setAutoCommit(false);
  7. Statement st = conn.createStatement();
  8. for(int i=0;i<100000;i++){
  9. String sql="insert into t1(id) values ("+i+")";
  10. st.executeUpdate(sql);
  11. }
  12. //结束时间
  13. Long endTime = System.currentTimeMillis();
  14. System.out.println("st:"+(endTime-beginTime)/1000+"秒");//计算时间
  15. st.close();
  16. conn.close();
  17. } catch (SQLException e) {
  18. e.printStackTrace();
  19. }
  20. }

//2.使用PreparedStatement对象

  1. public void exec2(Connection conn){
  2. try {
  3. Long beginTime = System.currentTimeMillis();
  4. conn.setAutoCommit(false);//手动提交
  5. PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");
  6. for(int i=0;i<100000;i++){
  7. pst.setInt(1, i);
  8. pst.execute();
  9. }
  10. conn.commit();
  11. Long endTime = System.currentTimeMillis();
  12. System.out.println("pst:"+(endTime-beginTime)/1000+"秒");//计算时间
  13. pst.close();
  14. conn.close();
  15. } catch (SQLException e) {
  16. e.printStackTrace();
  17. }
  18. }

//3.使用PreparedStatement + 批处理

  1. public void exec3(Connection conn){
  2. try {
  3. conn.setAutoCommit(false);
  4. Long beginTime = System.currentTimeMillis();
  5. //构造预处理statement
  6. PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");
  7. //1万次循环
  8. for(int i=1;i<=100000;i++){
  9. pst.setInt(1, i);
  10. pst.addBatch();
  11. //每1000次提交一次
  12. if(i%1000==0){//可以设置不同的大小;如50,100,500,1000等等
  13. pst.executeBatch();
  14. conn.commit();
  15. pst.clearBatch();
  16. }
  17. }
  18. Long endTime = System.currentTimeMillis();
  19. System.out.println("pst+batch:"+(endTime-beginTime)/1000+"秒");
  20. pst.close();
  21. conn.close();
  22. } catch (SQLException e) {
  23. e.printStackTrace();
  24. }
  25. }

在Oracle 10g中测试,结果: 
1.使用statement  耗时142秒; 
2.使用PreparedStatement 耗时56秒; 
3.使用PreparedStatement + 批处理耗时: 
   a.50条插入一次,耗时5秒; 
    b.100条插入一次,耗时2秒; 
    c.1000条以上插入一次,耗时1秒; 
通过以上可以得出结论,在使用jdbc大批量插入数据时,明显使用第三种方式(PreparedStatement + 批处理)性能更优。

-------------------------------------------------------------------------------------------------------------------------------

  1. 普通方式处理大量数据的insert时,处理速度相当慢。
  2. */
  3. PreparedStatement ps = null;
  4. //循环10000次
  5. for(int i = 0; i < 100000; i++) {
  6. ps = con.prepareStatement(sql);
  7. ps.executeUpdate();
  8. }
    1. 方法二:通过addBatch()的方式,将数据缓存在对象里面,通过最后执行executeBatch();方法提交,因此速度会快很多!
    2. */
    3. PreparedStatement ps = con.prepareStatement(sql);
    4. for(int i = 0; i < 100000; i++) {
    5. ps.setString(1, "1");
    6. ps.setString(2, "2");
    7. ps.addBatch();
    8. }
    9. ps.executeBatch();

用Java向数据库中插入大量数据时的优化的更多相关文章

  1. MySQL_(Java)使用JDBC向数据库中插入(insert)数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...

  2. 通过mybatis向数据库中插入日期数据

    遇到的问题: 通过mybatis向数据库中插入日期格式数据,发现只有年月日, 没有小时分钟和秒 当你想在实体类中使用java.util.Date类型,而且还想在数据库中保存时分秒时, 解决办法: 你可 ...

  3. mysql/mariadb数据库在插入表数据时,ID竟然成奇数增加了?看完下面内容就知道怎么处理了。

    今天突然被问到一个问题,mysql数据库插入表数据时,设置了ID自增,但是插入数据后,ID却呈奇数增加,不是123456类型,而是13579形式,突然有点懵,研究了一会,发现是auto_increme ...

  4. 003杰信-在jsp页面输入数据,然后在oracle数据库中插入factory数据,当字段允许为空时要特殊处理

    本博客的内容全部来自于传智播客,特在此说明. 业务要求如下:在jsp页面(jFactoryCreate.jsp)上输入数据时,转到后台,并输入到数据库. jFactoryCreate.jsp页面:

  5. Java快速向数据库中插入大量数据 比如10万条以上

    String sql = "insert into table *****"; //必须要有这句,要不然效果不明显 con.setAutoCommit(false); ps = c ...

  6. SQL 数据库连续插入大批量数据时超时

    经常会处理大批量千万级的数据,一直以来都没问题.最近在处理时确出来了经常超时,程序跑一段时间就得停下来重启服务器,根据几次的调整发现了问题的所在,产生这类问题主要是以下几点所导致:      1.数据 ...

  7. Java程序向MySql数据库中插入的中文数据变成了问号

    找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...

  8. MySQL_(Java)使用JDBC向数据库中修改(update)数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...

  9. MySQL_(Java)使用JDBC向数据库中删除(delete)数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...

随机推荐

  1. Android成长之路-实现简单动画

    实现简单动画: 在drawable目录中放入图片, 并且创建xml文件 frame.xml 存入图片,如下: <pre class="html" name="cod ...

  2. operator new 和 operator delete 实现一个简单内存泄漏跟踪器

    先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针.当前文件.当前行等信息添加进Trace 成员map容器内,在调用operator delete ...

  3. 利用docker-maven-plugin快速交测

    目的 由开发环境交测的时候,通过docker镜像简化环境搭建及项目部署的过程. 环境描述 项目开发环境: windowns7 在windowns7中通过VMware Workstation安装Cent ...

  4. 线程相关函数(2)-pthread_self()获取调用线程ID

    获取调用线程tid #include <pthread.h>pthread_t pthread_self(void); 示例: #include <pthread.h> #in ...

  5. 【ActiveMQ】ActiveMQ在Windows的安装,以及点对点的消息发送案例

    公司最近会用MQ对某些业务进行处理,所以,这次我下载了apache-activemq-5.12.0-bin把玩下. 基于练习方便需要,使用Windows的版本. 参考的优秀文章: activemq的几 ...

  6. spring-boot 集合mybatis 的分页查询

    spring-boot 集合mybatis 的github分页查询 一.依赖包 <!-- mysql 数据库驱动. --> <dependency> <groupId&g ...

  7. gdb 初步学习记录

    客户有一段代码,一个死循环, 里面就一个 times(NULL) 函数,以及一个usleep, 运行了10分钟左右就会出现段错误. 现在用 gdb 调试看一下是哪一步出现了问题. 在Linux 虚拟机 ...

  8. [config]关于make *config

    最近在编译uboot和kernel,二者的编译都有make *_defconfig的用法,而以前都是make menuconfig然后再make, 对于现在这种用法还不太了解,网上查了下,有人给出 如 ...

  9. Qt下QTableWidget的使用

    1.QTableWidget的基本设置 ui->tableWidget->setColumnCount(11); ui->tableWidget->setRowCount(Nu ...

  10. 【Spring实战】—— 3 使用facotry-method创建单例Bean总结

    如果有这样的需求: 1 不想再bean.xml加载的时候实例化bean,而是想把加载bean.xml与实例化对象分离. 2 实现单例的bean 以上的情况,都可以通过工厂方法factory-metho ...