- 浏览: 881415 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (509)
- android (55)
- CSS (23)
- eclipse (25)
- Data Structes and Algorithms (53)
- J2SE (87)
- Java_面试学习_j2se (26)
- java_面试学习_非技术 (13)
- java_gui (2)
- java_设计模式 (27)
- JDBC (10)
- java_web (15)
- hibernate (5)
- Oracle (37)
- Struts2 (7)
- Word-----dos (24)
- Jbpm (3)
- java小技巧 (8)
- math (1)
- flex (12)
- WebService (4)
- 生活 (9)
- 小框架或小语言 (27)
- spring (1)
- 面试~~~软实力 (7)
- jstat的用法 (1)
- jmap (1)
- 数据链路层和传输层的流量控制区别 (1)
- shell (0)
- 财商 (1)
- javascript (0)
- js研究 (1)
- 代码收集 (0)
最新评论
-
海尔群:
http://jingyan.baidu.com/articl ...
android加密 -
完美天龙:
------------------------- ...
asm----字节码操纵 -
houniao1990:
大神,请问 string 类型 定义为 oracle的 cha ...
hibernate注解 -
JamesQian:
Line:103
f.doFilter(msg);
是否需 ...
责任链模式_过滤器模式 -
sacoole:
好评
interview--- 如何从N个数中选出最大(小)的n个数?
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();
使用上述方法分别插入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的类型
DatabaseMetaData dbmd=conn.getMetaData();
//若a为true则意味着该数据是支持批量更新的
boolean a=dbmd.supportsBatchUpdates();
为了保证批量更新的操作可以正确处理错务,必须把批量更新的操作视为单个事务,如果批理更新在执行过程中失败,则让事务回滚到操作开始之前的状态。为了达到这种效果,程序应该在开始批量操作之前先关闭自动提交,然后开始收集更新语句,当批量操作执行结束后,提交事务,并恢复之前的自动提交模式
具体如下代码片断所示
try
{
//保存当前自动提交模式
boolean autoCommit=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 id in(0";
String id[]=要删除的ID数组;
for(int i=0;i <id.length;i++)
{
sql+=","+id[i];
}
sql+=")";
PreparedStatement ps=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的批量插入
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();
使用上述方法分别插入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的类型
DatabaseMetaData dbmd=conn.getMetaData();
//若a为true则意味着该数据是支持批量更新的
boolean a=dbmd.supportsBatchUpdates();
为了保证批量更新的操作可以正确处理错务,必须把批量更新的操作视为单个事务,如果批理更新在执行过程中失败,则让事务回滚到操作开始之前的状态。为了达到这种效果,程序应该在开始批量操作之前先关闭自动提交,然后开始收集更新语句,当批量操作执行结束后,提交事务,并恢复之前的自动提交模式
具体如下代码片断所示
try
{
//保存当前自动提交模式
boolean autoCommit=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 id in(0";
String id[]=要删除的ID数组;
for(int i=0;i <id.length;i++)
{
sql+=","+id[i];
}
sql+=")";
PreparedStatement ps=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
2012-06-07 20:51 912http://www.iteye.com/topic/6466 ... -
j2se----jdk6---httpServer
2012-06-05 20:42 1407package com.tdt.server.httpse ... -
j2se基础---ThreadLocal
2012-06-02 20:47 1089package cn.itcast.heima2; ... -
获取运行时的堆栈信息
2011-12-11 11:00 2163public class Hi { public st ... -
简说XML的解析方式(DOM,SAX,StAX)
2011-09-30 08:44 929一般来说,解析XML文件存在着两种方式,一种是event-ba ... -
j2se----Java异步socket
2011-07-11 17:10 1437用异步输入输出流编写Socket进程通信程序 在Merlin ... -
j2se----socket的缓冲区讨论
2011-07-08 19:52 1768关于socket的发送缓冲区 ... -
Tomcat的Socket实现:org.apache.tomcat.util.net(一)
2011-07-08 19:12 1919org.apache.tomcat.util.net包的内容都 ... -
翻转句子中单词的顺序
2011-07-07 22:42 1749题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺 ... -
j2se---同步的Map
2011-07-07 20:50 1001顾名思义LinkedHashMap是比HashMap多了一个链 ... -
j2se---同步的Map
2011-07-07 20:48 10Map<String String> map = ... -
asm----字节码操纵
2011-06-30 09:14 3934想通过asm的代码生成来写.class文件至少得了解下面的 ... -
j2se----java中,如何获得用户当前的工作目录
2011-05-11 09:44 1869获得当前路径, get java current dire ... -
j2se-----zip
2011-05-10 09:05 1051private InitData getInitFile( ... -
j2se-----可变参数列表
2011-04-01 10:53 880public static void main(Strin ... -
UML
2010-12-31 09:42 896组合: 一种强聚合 class Bird{ ... -
j2se-----metadata
2010-12-19 17:14 1011DatabaseMetaData的用法 ... -
python------一小时学会
2010-12-08 16:28 1915先上java与python的相互调用 如何在Java中调用Jy ... -
j2ee------download.jsp
2010-12-08 13:39 1117Logger logger = C ... -
effective------equals , hashCode
2010-11-22 12:04 1046覆盖equals时总是覆盖hashCode :你都认为他 ...
相关推荐
它提供了SQL-like语言(称为HQL,Hive Query Language)来处理数据,非常适合批处理和分析作业。Hive JDBC驱动使得Hive的数据可被任何支持JDBC的应用程序访问,如ETL工具、BI工具或Java应用等。 DataGrip是...
值得注意的是,Hive JDBC还支持批处理和预编译的PreparedStatement,以提高性能。此外,为了提高安全性,建议使用SSL连接,并对敏感信息进行加密。 在实际项目中,"hive-jdbc-uber-2.6.5.0-292.jar"可以作为大数据...
该驱动程序支持执行复杂的分布式计算、批处理和数据分析操作,特别适用于大规模数据处理场景。开发人员能够利用它在 Java 应用程序中运行大数据查询、获取分析结果,并将其集成到企业数据流程中。此外,它具备良好的...
4. **批处理**:支持批量执行SQL语句,提高执行效率。 5. **事务管理**:虽然Hive本身不完全支持ACID事务,但驱动提供了部分事务管理能力。 6. **安全认证**:支持Kerberos等安全协议,确保数据访问的安全性。 7. **...
Hive JDBC还支持多种特性,如预编译的`PreparedStatement`,事务处理,以及批处理等,提高了性能和安全性。对于大数据应用来说,Hive JDBC是一个强大而灵活的工具,能够帮助开发者轻松地将Hadoop集群的数据整合到...
比如,为了提高性能,可以使用批处理(Batch Processing)来一次执行多个SQL语句,或者使用预编译的`PreparedStatement`来减少解析SQL的时间。同时,注意避免SQL注入攻击,确保输入数据的安全性。 总的来说,`...
这个版本提供了对SQL Server的各种功能支持,包括但不限于连接、查询、事务处理、批处理等,并且遵循JDBC API标准,使得Java开发者可以方便地操作SQL Server数据库。 标签中的"sqlserverjdbc"是SQL Server JDBC驱动...
SQL Server JDBC驱动还支持一些高级功能,如批处理、存储过程调用、游标、预编译的`PreparedStatement`、JDBC连接池等。这些特性可以帮助优化性能并简化代码。 总之,`mssql-jdbc-6.4.0.jre8.jar`是Java连接SQL ...
此外,它还支持批处理操作,提高了数据导入和更新的效率。 四、安全特性 作为X-Pack的一部分,SQL JDBC提供了安全功能,如身份验证、授权和加密。用户可以通过设置访问控制,限制不同用户或应用对Elasticsearch数据...
《Elasticsearch-JDBC连接MySQL实现大数据搜索》 在当今的大数据时代,高效的数据检索与分析成为了企业核心竞争力的一部分。Elasticsearch作为一个强大的开源搜索引擎,以其分布式、实时、灵活的特性,广泛应用于...
此外,为了优化性能,可以使用`clickhouse-jdbc`的批处理特性,一次性发送多个SQL语句到Clickhouse服务器。 总的来说,`clickhouse-jdbc-0.1.50d.zip`文件提供了连接和操作Clickhouse数据库的关键工具,使得Java...
8. **性能优化**:通过使用PreparedStatement和批处理,可以提高执行效率。同时,使用连接池(如C3P0、HikariCP等)可以有效地管理数据库连接,避免频繁创建和关闭连接带来的开销。 9. **安全性**:在生产环境中,...
4. 支持高级特性:如批处理、游标、事务、存储过程等。 5. 国际化:支持多语言和字符集,包括Unicode。 五、安全与最佳实践 在使用`sqljdbc-1.0.jar`时,应遵循一些最佳实践,以确保安全性: 1. 避免硬编码数据库...
- 使用Clickhouse-JDBC时,可以利用批处理执行多条SQL语句,减少网络通信次数,提高性能。 - 注意选择合适的数据类型,Clickhouse提供了多种类型,如:Float32/64、Int8/16/32/64、DateTime等,合理选择可以提高...
除了基本的CRUD操作,SQLite JDBC驱动还支持更复杂的SQL特性,如事务管理、存储过程、游标、批处理等。例如,你可以使用`conn.setAutoCommit(false)`开启手动事务控制,然后在所有操作成功后再提交。 此外,SQLite ...
5. 高级特性:支持事务、批处理、预编译语句等功能。 在动态加载Hive JDBC 1.1.0驱动时,我们需要确保包含所有必需的jar包。"test-hive1.1.0"可能是一个包含这些jar的目录或者压缩文件。通常,除了`hive-jdbc-1.1.0...
此驱动程序提供了对高级特性的支持,如批处理、存储过程调用等。 4. **sqljdbc.jar**:这同样是微软的SQL Server JDBC驱动,但可能是一个早期版本。与sqljdbc4.jar相比,可能缺少某些功能或优化。这两个驱动可能会...
GBase JDBC驱动提供了强大的功能,包括事务处理、批处理、游标操作等,使得Java开发者能高效地进行数据库操作。在实际应用中,还应注意性能优化,如使用预编译的`PreparedStatement`来防止SQL注入,以及合理设置连接...
此外,它还提供了批处理功能,可以一次提交多个SQL语句,提高执行效率。对于大数据处理,支持分片查询和并行执行,充分发挥Greenplum的并行计算能力。 在性能方面,"greenplum-jdbc-5.1.4.jar"可能针对Greenplum...
7. **批处理**: 使用`Statement`的`addBatch()`和`executeBatch()`方法可以批量执行SQL插入、更新或删除操作,提高效率。 8. **游标**: Oracle JDBC支持游标,允许应用程序一次处理结果集中的一行数据,从而处理...