日期:2014-05-16  浏览次数:20553 次

jdbc--批处理
http://jdgnewtouch.iteye.com/blog/1308626

一、JDBC的批量插入
    JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等。
    我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试
    方法一,使用PreparedStatement加批量的方法
    Java代码    
  try {  
      Class.forName("com.mysql.jdbc.Driver");  
      conn = DriverManager.getConnection(o_url, userName, password);  
      conn.setAutoCommit(false);  
      String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,object_id) VALUES(?,?,?,?,?)";  
      PreparedStatement prest = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);  
      for(int x = 0; x < size; x++){  
         prest.setString(1, "192.168.1.1");  
         prest.setString(2, "localhost");  
         prest.setString(3, "20081009");  
         prest.setInt(4,;  
         prest.setString(5, "11111111");  
         prest.addBatch();  
      }  
      prest.executeBatch();  
      conn.commit();  
      conn.close();  
} catch (SQLException ex) {  
   Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);  
} catch (ClassNotFoundException ex) {  
     Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);  
}  

说明下在建Statement的时候,后面两个参数的意义:
第一个参数指定 ResultSet 的类型。其选项有:
TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。
第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有:
CONCUR_READ_ONLY:这是缺省值,指定不可以更新
ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet

方法二 使用Statement加批量的方法
Java代码
   
conn.setAutoCommit(false);  
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);  
for(int x = 0; x < size; x++){  
   stmt.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");  
}  
stmt.executeBatch();  
conn.commit();  
方法三:直接使用Statement
Java代码
conn.setAutoCommit(false);  
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  
                                    ResultSet.CONCUR_READ_ONLY);  
for(int x = 0; x < size; x++){  
   stmt.execute("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");  
}  
conn.commit(); 
使用上述方法