三种JDBC批量插入编程方法的比较
来源:互联网 发布:曼彻斯特 知乎 编辑:程序博客网 时间:2024/05/18 16:56
JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等。
【1】方法一,使用PreparedStatement加批量的方法
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, 8); 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
【2】方法二 使用Statement加批量的方法
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();
【3】方法三:直接使用Statement
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();
使用上述方法分别插入10万条数据的平均测试时间为:
方法一:17.844s
方法二:18.421s
方法三:16.359s
可以看出JDBC的batch语句插入不但没有性能提升,反而比没有用batch的时候要慢,当然这可能跟JDBC具体驱动的实现方法有关。 附件中是我测试代码,可以用来在自己电脑上跑一下。
在执行批量插入的时候最主要的是将自动提交取消,这样不管是否用JDBC的batch语法应该都没有关系。
conn.setAutoCommit(false)
0 0
- 三种JDBC批量插入编程方法的比较
- 三种JDBC批量插入编程方法的比较
- 三种JDBC批量插入编程方法的比较
- 三种JDBC批量插入编程方法的比较
- 三种JDBC批量插入编程方法的比较
- 三种JDBC批量插入编程方法的比较
- 三种JDBC批量插入编程方法的比较
- 三种JDBC批量插入编程方法的比较
- JDBC:大数据量插入的三种方法比较
- jdbc批量操作的三种方法
- PHP 批量插入数据三种方法性能比较
- JDBC批量插入数据的方法
- JDBC的批量批量插入
- JDBC的批量批量插入
- JDBC的批量插入
- JDBC的批量插入
- 点评 ibatis+oracle 批量插入的三种方法.
- 点评 ibatis+oracle 批量插入的三种方法
- TCP与UDP的区别
- The method consume(HttpEntity) is undefined for the type EntityUtils
- Python的包管理器工具pip的使用手册
- CDOJ 训练搜索专题G 八数码固定终点问题
- myeclipse 10的bug
- 三种JDBC批量插入编程方法的比较
- JavaScript constructor属性
- I/O多路复用select
- 成佩涛编程之路——缓存系统redis简单使用
- 穿透内网所了解的一些知识
- 递归函数最终会结束,那么这个函数一定?
- Android学习之——优化篇(1)
- oracle SCN入门详解
- 不经意间用了ibatis的缓存引发的一个问题