一、JDBC的批量插入

JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等。

我用Mysql5.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,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

方法二 使用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 INTOadlogs(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 INTOadlogs(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语法应该都没有关系。

Java代码

conn.setAutoCommit(false)

二、JDBC的批量更新

由于阿堂在原来的老项目中,用jdbc操作时,用到了jdbc的批量操作,加上前段时间看《疯狂java讲义》时,也看到李刚作者的相关介绍。考虑还是会有人要用到jdbc的操作的,所以,阿堂还是把它整一下,就成了下面的文字了。用JDBC的DML语句时(insert,delete,update),我们可能可能需要同时某几个表都要进行DML操作,比如,当我们对A表插入的时候,同时也要对B表插入相关的记录,还要同时更新C表的关联记录,这样就会涉及到三条DML的sql语句,如果不用批量更新功能的话,我们就得单独去处理,效率相对就要低些了。。使用批量更新时,多条sql语句将会被作为一批操作被同时收集,并同时提交。值得注意的是,批量更新必须得到底层数据库的支持,可能通过DatabaseMetaData的supportBatchUpdates方法来查看底层数据库是否支持批量更新

//conn是Connection的类型

DatabaseMetaDatadbmd=conn.getMetaData();//若a为true则意味着该数据是支持批量更新的

boolean a=dbmd.supportsBatchUpdates();

为了保证批量更新的操作可以正确处理错务,必须把批量更新的操作视为单个事务,如果批理更新在执行过程中失败,则让事务回滚到操作开始之前的状态。为了达到这种效果,程序应该在开始批量操作之前先关闭自动提交,然后开始收集更新语句,当批量操作执行结束后,提交事务,并恢复之前的自动提交模式

具体如下代码片断所示

try{//保存当前自动提交模式

booleanautoCommit=conn.getAutoCommit();//关闭自动提交

conn.setAutoCommit(false);//使用Statement同时收集多条sql语句

stmt.addBatch(insert_sql1);

stmt.addBatch(insert_sql2);

stmt.addBatch(update_sql3);

..//同时提交所有的sql语句

stmt.executeBatch();//提交修改

conn.commit();

conn.setAutoCommit(autoCommit);

}catch(Exception e)

{

e.printStackTrace()

conn.rollback();

}

附:需要说明的一点是,如果是addBatch()方法中加了select查询语句,程序将直接出现错务的

这个又是一种方法批量进行更新。但是我认为上面那个方法不错

tx=session.beginTransaction();

Connection con=session.connection();

PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGE=AGE+1 where AGE>0");

stmt.excuteUpdate();

tx.commit();

三、JDBC批量删除

String sql="delete from table where idin(0";

String id[]=要删除的ID数组;for(int i=0;i

{

sql+=","+id[i];

}

sql+=")";

PreparedStatementps=conn.prepareStatement(sql);

ps.execute();

public voiddeleteBat(Integer[] catNo){try{

Connection con=DBUtil.getInstance().getCon();

String sql="delete from cat where catno=?";

con.setAutoCommit(false);

PreparedStatement ps=con.prepareStatement(sql);for(Integer in : catNo) {

ps.setInt(1, in);

ps.addBatch();

}int[] result=ps.executeBatch();

con.commit();for (inti : result) {

System.out.println(i);

}

}catch(ClassNotFoundException e) {

e.printStackTrace();

}catch(SQLException e) {

e.printStackTrace();

}

mysql jdbc驱动 批量更新_jdbc-批量插入、批量删除、批量更新相关推荐

  1. jdbc mysql 存储过程查询数据_JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...

    主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十一 ...

  2. JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...

    主要内容:  JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...

  3. Ubuntu下eclipse部署mysql jdbc驱动

    1.mysql jdbc驱动包下载地址:http://dev.mysql.com/downloads/connector/j/ 版本:mysql-connector-java-5.1.17.zip 2 ...

  4. mysql数据回退_mysql DML 数据插入,删除,更新,回退

    mysql插入,删除,更新地址:https://wenku.baidu.com/view/194645eef121dd36a32d82b1.html http://www.cnblogs.com/st ...

  5. 【Jmeter】安装配置:Jmeter 下载 MySQL JDBC 驱动

    目录 一.MySQL JDBC 驱动版本选择 二.MySQL JDBC 驱动下载 (1)新建 Jmeter 插件备份文件夹

  6. MySQL JDBC驱动版本与MySQL数据库版本对应关系

    前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致.查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一 ...

  7. 判断触发器正在处理的是插入,删除还是更新触发

    平常时写触发器(TRIGGER),一般会分别写插入(INSERT),删除(DELETE)和更新(UPDATE)单独的触发器. 但是有时候,可以视看处进逻辑程度,可以把三者写成一个触发器,只是在其中稍作 ...

  8. arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新

    风过无痕 原文  arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...

  9. QTabelWidget表格的插入、删除、更新、动态滑动条以及配合QFile进行表格内容的长期存储

    QTabelWidget表格的插入.删除.更新以及配合QFile进行表格内容的长期存储 [1]QTabelWidget界面初始化 [2]QTabelWidget效果图 [3]QTabelWidget初 ...

  10. mysql jdbc驱动 批量更新_jdbc批量插入,删除,更新

    批量处理:一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能. 不确定JDBC驱动程序是否支持此功能.应该使用DatabaseMetaData.supportsBatchUpdates( ...

最新文章

  1. DK云网关与普通DTU之间的区别
  2. Java 洛谷 P1008 三连击
  3. 从Banner入手保护linux系统服务器
  4. 互联网日报 | 7月4日 星期日 | 高途回应招聘团队被裁传闻;恒大半年劲销3568亿领跑行业;吉利发布共同富裕计划行动纲领...
  5. 压缩 质量不变_来了!业内首个HEIF图像高质量压缩FPGA加速方案
  6. Node.js 创建第一个应用
  7. Android报unable to instantiate application怎么解决
  8. 论文笔记 Triformer: Triangular, Variable-Specific Attentions for Long SequenceMultivariate Time Series
  9. Oracle导出部分表 par,Oracle使用par文件进行全库导入导出
  10. poj百炼nbsp;2801:填词
  11. Untiy Shader - Metallic vs Specular Workflow 金属 vs 高光的工作流
  12. 微信推送封面尺寸_微信公众号推送文图片什么尺寸最佳?
  13. Pascal 英语句子语法解析器
  14. 有些MP4只有音频没有视频的解决办法
  15. 开机弹框显示IGCCTray.exe异常的修复方式
  16. jupyter lab指定exe文件添加、更改R kernel
  17. 简单使用github上的节操播放器
  18. 游戏角色建模和场景建模哪个好
  19. 【趣学算法】第二章 算法之美(下)
  20. Spring Security + JWT简单配置

热门文章

  1. linux滚动升级版本,Linux发行基础滚动版本与标准版本 | MOS86
  2. 众望所归!《觉醒年代》《山海情》成玉兰奖大赢家
  3. 真实IP收集及其利用方式
  4. C# Aspose Word获取章节首页页眉
  5. 【Android】简单的开机启动、全屏、Dialog尺寸
  6. 绕圈圈面试题(Python经典编程案例)
  7. 拨号盘拨号数字间距太小 调大 修改通讯录里面收藏和所有联系人字体颜色
  8. 苹果手机怎么关机重启
  9. login shell和non-login shell
  10. 一种基于输出电压的欠压保护电路设计方案