`
mgoann
  • 浏览: 253136 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java当中的批处理

    博客分类:
  • Java
阅读更多

在对数据库进行批量操作时,应分析操作的前后相关性,如果属于大批量的操作,而且前续操作的结果不依赖与后继操作,则完全可以使用批处理来操作DB

使用批处理的优点:

1.        多个SQL语句的执行,共用一个Connection资源。在对数据库操作时,connection资源是很宝贵的,数据库的维护从某种角度来说,就是减少数据库的连接数,减轻对DB的压力。创建一个数据连接要远远比使用数据库连接消耗资源。这也正是数据库连接池存在的意义。

public void updateStateBactch(List elms) { 
Connection conn = null; 
PreparedStatement ps = null; 
String sql = "update test_table set state=? where keyid = ?"; 

conn = DBTools.getConnection(); 

if(conn == null) 
{ 
log.error("[update][state][error][conn is null]"); 
return; 
} 

try { 
ps = conn.prepareStatement(sql); 
for(int i = 0; i < elms.size(); i++) { 
Element elm = (Element) elms.get(i); 
if(null == elm || null == elm.getUserId() 
|| null == elm.getState()) { 
continue; 
} 
ps.setInt(1, elm.getStatus()); 
ps.setString(2, elm.getProcID()); 
ps.addBatch(); 
} 
ps.executeBatch(); 
ps.clearBatch(); 
} catch (SQLException sqlEx) { 
log.warn("[update][state][error][SQLException]"); 
} catch (Exception e) { 
log.warn("[update][state][error][SQLException]"); 
} finally { 
DBTools.close(conn, ps, null); 
} 
} 

 

try { 
ps = conn.prepareStatement(sql); 
for(int i = 0; i < elms.size(); i++) { 
Element elm = (Element) elms.get(i); 
if(null == elm || null == elm.getUserId() 
|| null == elm.getState()) { 
continue; 
} 
ps.setInt(1, elm.getStatus()); 
ps.setString(2, elm.getProcID()); 
ps.addBatch(); 
if ((i != 0 && i % 2000 == 0) || i == elms.size() - 1) { 
ps.executeBatch(); 
ps.clearBatch(); 
ps.close(); 
ps = conn.prepareStatement(sql); 
} 
} 
} catch (SQLException sqlEx) { 
log.warn("[update][state][error][SQLException]"); 
log.warn(sqlEx); 
} catch (Exception e) { 
log.warn("[update][state][error][SQLException]"); 
log.warn(e); 
} finally { 
DBTools.close(conn, ps, null); 
} 

 

2. 使用批处理时,没有关注DB测异常情况,导致批处理失败。这里涉及到一些异常处理最基本的点。上述例程还有个小小的问题需要注意,当ps.executeBatch()执行时,如果该批次的SQL语句中有一条SQL抛出异常,那么后续的批处理将不会有执行的机会,导致漏执行。所以经过优化后:

try { 
ps = conn.prepareStatement(sql); 
for(int i = 0; i < elms.size(); i++) { 
try { 
Element elm = (Element) elms.get(i); 
if(null == elm || null == elm.getUserId() 
|| null == elm.getState()) { 
continue; 
} 
ps.setInt(1, elm.getStatus()); 
ps.setString(2, elm.getProcID()); 
ps.addBatch(); 
if ((i != 0 && i % 2000 == 0) || i == elms.size() - 1) { 
ps.executeBatch(); 
ps.clearBatch(); 
ps.close(); 
ps = conn.prepareStatement(sql); 
} 
} catch (SQLException e) { 
log.warn("[update][state][error][SQLException]"); 
log.warn(e); 
ps.clearBatch(); 
ps.close(); 
ps = conn.prepareStatement(sql); 
} catch (Exception e) { 
log.warn("[update][state][error][SQLException]"); 
log.warn(e); 
ps.executeBatch(); 
ps.clearBatch(); 
ps.close(); 
ps = conn.prepareStatement(sql); 
} 

} 
} catch (SQLException sqlEx) { 
log.warn("[update][state][error][SQLException]"); 
log.warn(sqlEx); 
} catch (Exception e) { 
log.warn("[update][state][error][SQLException]"); 
log.warn(e); 
} finally { 
DBTools.close(conn, ps, null); 
} 

 

3. 使用批处理时,当批处理中有一条SQL语句优化SQL异常而导致整个批处理失败。在打印日志时应该注意,以上的打印方式对问题定位没有任何帮助。如上如果其中的一条SQL语句执行失败,那么你不知道究竟是什么异常,因为没有打印异常列,而只打印了最顶层异常。例如:如上程序在DB2数据库中执行失败后,只返回了如下信息com.ibm.db2.jcc.c.vd: Non-atomic batch failure.  The batch was submitted, but at least one exception occurred on an individual member of the batch. Use getNextException() to retrieve the exceptions for specific batched elements.大概意思是批处理执行失败,批处理已经提交,但是其中至少有一条或者多条执行失败。使用getNextException来查看执行白失败的SQL语句异常信息,便于定位!可是这样还是有问题,你知道了SQL语句的异常了,但是你不知道究竟是那条SQL语句导致的异常,其实可以更具批处理执行的返回值来检查执行结果。

Int[] results = ps.executeBatch();

1
0
分享到:
评论

相关推荐

    Java调用批处理示例

    ### Java调用批处理知识点详解 #### 一、概述 在Java中,有时我们需要执行一些系统级别的任务,比如启动一个程序或执行一个脚本。此时,我们可以通过Java调用来实现这些功能。Java提供了多种方法来调用外部命令,...

    java超简易批处理

    Java批处理是一种自动化执行Java程序的方法,主要用于简化重复性任务,比如编译和运行多个Java源文件。在Java开发环境中,通常需要通过`javac`命令来编译`.java`源文件,然后通过`java`命令来运行生成的`.class`字节...

    java批处理示例 java

    java批处理示例 java批处理示例

    一键编译运行java的批处理文件

    适合EmEditor和Editplus文本编辑器配置一键编译运行java的批处理文件

    java实现batch定时批处理

    用java springboot框架实现定时批处理,更新DB字段内容,更新成功后微信短信推送消息给用户

    文件批处理模块_java_批处理_源码

    Java文件批处理模块是一种用于高效管理大量文件的程序设计,主要应用于自动化操作,例如批量删除、移动或复制文件。在Java编程中,实现这样的功能通常涉及到对文件系统API的深入理解和利用。以下是对该模块的一些...

    java工程编译批处理文件

    Client.bat文件写的一个java工程自动编译脚本,可供参考写其它Java工程批处理文件。

    java批处理文本文件

    从E盘a文件夹读取txt文档,自动将以@开头以结束的字符串重新写入E盘c文件夹下

    批处理作业调度回溯法java实现

    批处理作业调度回溯法java实现 批处理作业调度回溯法是一种解决作业调度问题的算法,它通过回溯法来搜索所有可能的解决方案,以找到最佳的作业调度方式。在这个Java实现的批处理作业调度程序中,我们使用回溯法来...

    java批处理

    Java批处理是一种在大型系统中处理大量数据的高效方法,特别是在与数据库进行交互时,它能够显著提升性能和效率。批量处理技术的核心是通过减少单个请求的频率,而是将多个请求合并为一个批次,从而减少了网络延迟和...

    java调用bat批处理与sh脚本

    这篇博客“java调用bat批处理与sh脚本”将详细讲解如何在Java程序中实现这一功能。 首先,我们要理解Java是如何与操作系统进行交互的。Java提供了`Runtime`类和`ProcessBuilder`类,这两个类都可以用来执行外部命令...

    Java实现的批处理作业调度问题算法

    这是一个用Java实现解决批处理作业调度问题的算法

    java实现文件批处理

    在Java编程语言中,文件批处理是一项常见的任务,它涉及到大量文件的操作,如复制、分割、合并以及解压缩。以下是对这些操作的详细说明: **复制文件方法:** 在Java中,可以使用`java.io`包中的`FileInputStream`...

    java环境变量批处理文件

    下载后,用记事本编辑bat文件自行修改批处理文件中的jdk 路径

    批处理执行java代码

    批处理执行Java代码是一种在没有用户交互的情况下自动化运行Java程序的方法。这通常涉及到创建一个批处理脚本(在Windows系统中是`.bat`文件,在Unix或Linux系统中是`.sh`文件),然后在这个脚本中调用Java命令来...

    java 批处理的资源

    Java批处理是一种在Java环境中对大量数据或任务进行自动化处理的技术。它通常用于执行一系列预定义的任务,这些任务可以是数据库操作、文件处理、数据分析等,而无需人为交互。批处理能够提高工作效率,减少手动操作...

    java调用批处理

    在Java编程中,调用批处理操作是一种常见的需求,特别是在处理大量数据或执行自动化任务时。批处理可以提高效率,因为它允许一次性处理多个输入,而不是逐个处理。本篇文章将探讨如何在Java中调用批处理,以及相关的...

    Java开发环境配置批处理

    Java开发环境配置批处理是Java开发者在安装和设置工作环境时常常会遇到的一个步骤,它主要是为了简化和自动化Java开发所需的环境变量配置过程。本文将详细介绍如何创建和使用批处理文件来配置Java开发环境,以及...

    文件批处理模块java源码

    在Java编程领域,文件批处理是一项重要的技能,尤其对于数据处理和系统集成任务而言。本模块专注于批处理大量文件,可以提升工作效率并优化资源利用。下面将详细解析这个"文件批处理模块java源码"的相关知识点。 ...

Global site tag (gtag.js) - Google Analytics