使用jdbc向数据库插入100000条记录

分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:

//1.使用statement插入100000条记录 

Java代码  

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

 

//2.使用PreparedStatement对象 

Java代码  

  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.   
  19. }   

 

//3.使用PreparedStatement + 批处理 

Java代码  

  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 + 批处理)性能更优。 

 

 

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

Java代码  

  1. /*  

Java代码  

  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. }  

 /*

 

Java代码  

  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(); 
时间: 2024-11-01 00:10:15

使用jdbc向数据库插入100000条记录的相关文章

oracle可以一次性插入多条记录吗?

问题描述 oracle可以一次性插入多条记录吗? 而且数据还是有重复的,比如说要插入一个日期和一个上班状况,日期是主键,数据是:2015-05-10,请假:2015-05-11,请假:2015-05-12,请假.本来用的是insert into ... select...from dual union select......,但是报错违反唯一约束条件 刚开始做.不太会还请指教 解决方案 为什么要用日期当主键啊...不会重复么??? 解决方案二: insert into table(...)se

oracle 数据库...-oracle 数据库插入一条数据,某字段如何自动递增1

问题描述 oracle 数据库插入一条数据,某字段如何自动递增1 oracle 数据库插入一条数据,某字段如何自动递增1,oracle 数据库插入一条数据,某字段如何自动递增1,在线等.急急急.求大指点 解决方案 1,使用序列 2,手动使用变量++然后执行插入数据库记录 解决方案二: oracle 字段递增 表插入数据,id自动增1 解决方案三: Oracle里有序列,使用序列来实现 解决方案四: 序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l 自动提供唯一的数值 l 共享对

往数据库新增一条记录insert into之前,先查询判断一下字段里面是否有重复值,怎么实现?

问题描述 往数据库新增一条记录insert into之前,先查询判断一下字段里面是否有重复值,怎么实现? 如题,写到这里不知道怎么实现了,请各位大侠指点. Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click If TextBox1.Text = "" Then MessageBox.Show("Please input code请输入编号") Else

c#-C#向oracle插入多条记录

问题描述 C#向oracle插入多条记录 我需要把这个 richTextBox2中的5条数据,一行一行的插入到oracle中,命令如下: int linecount = richTextBox2.Lines.Length; for (int o = 0; o <= linecount - 1; o++) { string linestr = ""; linestr = richTextBox2.Lines[o]; OracleConnection con = new Oracle

存储-sql 能向表中间插入一条记录吗

问题描述 sql 能向表中间插入一条记录吗 难道只能在表尾插入? 因为现在想实现一个笔记页码的存储,不知如何保证页码号的连续,想使用一条记录来代表一页,使用autoincrement在删除一条记录的时候页码不会自动连续,就想直接不用页码,但是怎么能向表中插入一条记录? 或者其他的实现思路? 解决方案 你的表结构不合理.你希望插入中间,你的数据库的表结构应该类似链表 id preid(上一条记录id) data 解决方案二: 或者还有一个办法,增加一个排序码浮点字段 中间插入,就取两个id差的1/

SQL Server使用一个语句块批量插入多条记录的三种方法_mssql2008

我们在日常操作中,免不了对数据库的某张表,一次性的要插入多条记录,但是首先想到的就是复制,粘帖N多重复的INSERT INTO 语句,万一某一个少了一个分号,或多个逗号之类的,产生错误,要找起来可就费尽了,既浪费时间,又耽误工作. 除了上面所说的方法外,其实还有二中方法,相比较起来要比之前那个要简洁. 首先是之前那个方法:    复制代码 代码如下: INSERT INTO MyTable(ID,NAME) VALUES(1,'123'); INSERT INTO MyTable(ID,NAME

三种返回mysql 插入一条记录返回该记录id方法

三种返回mysql教程 插入一条记录返回该记录id方法 方法一 id int(11) not null pri key auto_increment,name varchar(12),backup varchar(50) 现在想插入一条记录的同时,返回他的id值(插入时只是插入name和backup字段的值).请问该如何写这条语句.谢谢! 你的担心完全多于. 不需要锁表, 返回的ID肯定是你的,基于当前连接session 自动返回最后一个INSERT或 UPDATE 问询为 AUTO_INCRE

java-关于用jdbc向数据库插入date字段为空值的 为什么 会报错

问题描述 关于用jdbc向数据库插入date字段为空值的 为什么 会报错 这是抛出来的异常 求大神救命..! java.sql.SQLException: 无效的列类型 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179) at oracle.jdbc.dbaccess.DBErr

安卓 sqlitw数据库设计 多条记录

问题描述 安卓 sqlitw数据库设计 多条记录 安卓 每一项活动有多人参与 记录参与人的姓名怎样设计数据库 可以使得根据人的名称来获取参与的所有记录更方便 解决方案 额..这个跟是不是安卓,以及是什么DB,应该没关系吧.1.活动表(活动id,xxxxxxx)2.人员表(人员id,xxxxxxxxx)3.活动参与 人员表(活动id,参与人id) 多对多的 查记录只要查"活动参与 人员表"就可以了,当然,数据量有可能会比较大,那么还有个方案2.1.不变2.不变3.活动参与人员表(活动id