jdbc-批量插入、批量删除、批量更新
一、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<id.length;i++)
{
sql+=","+id[i];
}
sql+=")";
PreparedStatementps=conn.prepareStatement(sql);
ps.execute();
public void deleteBat(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 (int i : result) {
System.out.println(i);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
jdbc-批量插入、批量删除、批量更新的更多相关文章
- mybatis + mysql 批量插入、删除、更新
mybatis + mysql 批量插入.删除.更新 Student 表结构 批量插入 public int insertBatchStudent(List<Student> studen ...
- 个人永久性免费-Excel催化剂功能第32波-空行空列批量插入和删除
批量操作永远是效率提升的王道,也是Excel用户们最喜欢能够实现的操作虽说有些批量操作不一定合适Excel的最佳实践操作,但万千世界,无奇不有,特别是在国人眼中领导最大的等级森严的职场环境下.Exce ...
- JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能
主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...
- arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新
风过无痕 原文 arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...
- mysql DML 数据插入,删除,更新,回退
mysql插入,删除,更新地址:https://wenku.baidu.com/view/194645eef121dd36a32d82b1.html http://www.cnblogs.com/st ...
- Oracle批量查询、删除、更新使用BULK COLLECT提高效率
BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记 例1: 批量查询项目资金账户号为 &q ...
- SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)
临时表:Test /****** 对象: Table [dbo].[Test] 脚本日期: 05/10/2013 11:42:07 ******/ SET ANSI_NULLS ON GO SET Q ...
- mybatis使用foreach进行批量插入和删除操作
一.批量插入 1.mapper层 int insertBatchRoleUser(@Param("lists") List<RoleUser> lists);//@Pa ...
- MongoDB的学习--文档的插入、删除和更新
最近在看<MongoDB权威指南>,写博客记录一下相关内容~~ 关于安装之类的最基本的就不多说了,从基本操作增删改查开始. MongoDB官网地址:http://www.mongodb.o ...
- MongoDB笔记(三):Document 数据插入、删除、更新
实例数据库caliven.集合users 一.插入文档 1.插入文档 db.[documentName].insert({}) 2.批量插入文档 .shell 这样执行是错误的db.[document ...
随机推荐
- Intent属性详解二 Action、Category
先看效果图: 1.Action:该activity可以执行的动作 该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-fi ...
- android 很详细的序列化过程Parcelable
直接上代码:注释都写的很清楚了. public class Entry implements Parcelable{ public int userID; public String username ...
- 你真的了解UITabBarController吗?
一:首先查看一下关于UITabBarController的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewCo ...
- 《javascript权威指南》读书笔记——第一篇
<javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...
- NSError
-(NSString * )backErrorString{ // self.code; //http://blog.csdn.net/linkai5696/article/details/59 ...
- Java导入的项目乱码怎么解决?(Ⅱ)
1.首先 打开 >> Eclipse或Myeclipse.(我用的是Myeclipse) 2.打开 >> Window >> Preferences ...
- TNS-12541: TNS:no listener TNS-12560 TNS-00511: No listener
为了测试需要,系统管理员帮忙将一台ORACLE数据库服务器克隆到虚拟机上,我上去删除了root.oracle.tomcat账号下的crontab定时作业,然后启动了ORACLE数据库实例,删除 ...
- .NET应用架构设计—服务端开发多线程使用小结(多线程使用常识)
有一段时间没有更新博客了,最近半年都在着写书<.NET框架设计—大型企业级框架设计艺术>,很高兴这本书将于今年的10月份由图灵出版社出版,有关本书的具体介绍等书要出版的时候我在另写一篇文行 ...
- linux shell for循环使用命令中读取到的值实例
#!/bin/bash file="states" for state in `cat $file` do echo "Visit beautiful $state&qu ...
- 烂泥:学习tomcat之通过shell批量管理多个tomcat
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 公司的业务是使用tomcat做web容器,为了更有效的利用服务器的性能,我们一般部署多个 ...