`

批量抓取和更新

阅读更多
当需要select、update、delete大量数据的时候,将操作一次执行将有效提高性能。可以想象成设置了一个缓冲区, 只有当缓存满了的时候才一次性执行,所以缓存越大,执行次数越少,速度越快。这个过程姑且叫作批处理。

想象一下批处理如何实现的,假设对于select、update、delete, 似乎都可以将同一个表的拼接where id=1 or id=2 ...来做。但insert呢?我就不知道了

对于hibernate,可以查看hibernate3的文档,关于批量处理有如下配置:
1)
hibernate.max_fetch_depth
为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取. 取值 建议在0到3之间取值
hibernate.default_batch_fetch_size
为Hibernate关联的批量抓取设置默认数量. 取值 建议的取值为4, 8, 和16

2)
hibernate.jdbc.fetch_size
非零值,指定JDBC抓取数量的大小 (调用Statement.setFetchSize()).
hibernate.jdbc.batch_size
非零值,允许Hibernate使用JDBC2的批量更新.
取值 建议取5到30之间的值

第一组是对于集合映射情况,但只是fetch策略,当抓取多个对象时,它们的集合不需要一个一个抓取出来,而是通过...or...一次能够抓取几个集合,可以看出这也是一种对n+1问题的缓解,当然感觉不如直接join来得简单和快捷。
第二组配置包含了jdbc字样,因此是只需jdbc支持的,并非hibernate。应该受限于数据库的支持以及驱动支持。却不仅有fetch,还有batch,看来hibernate的batch update实际上是基于jdbc已实现的,并非原创啊(不看不知道,一看吓一跳)

下面具体看看第二组,jdbc的fetch和batch:
Statement.setFetchSize()的javadoc
 /**
     * Gives the JDBC driver a hint as to the number of rows that should 
     * be fetched from the database when more rows are needed.  The number 
     * of rows specified affects only result sets created using this 
     * statement. If the value specified is zero, then the hint is ignored.
     * The default value is zero.
     *
     * @param rows the number of rows to fetch
     * @exception SQLException if a database access error occurs, or the
     *        condition 0 <= <code>rows</code> <= <code>this.getMaxRows()</code> 
     *        is not satisfied.
     * @since 1.2
     * @see #getFetchSize
     */

大意应该是当从数据库返回大量数据时可以设置一个缓冲记录数,而这个设定只对于使用该statement并返回resultset时会生效。

Statement.executeBatch()的说明:
**
     * Submits a batch of commands to the database for execution and
     * if all commands execute successfully, returns an array of update counts.
     * The <code>int</code> elements of the array that is returned are ordered
     * to correspond to the commands in the batch, which are ordered 
     * according to the order in which they were added to the batch.
     * The elements in the array returned by the method <code>executeBatch</code>
     * may be one of the following:
     * <OL>
     * <LI>A number greater than or equal to zero -- indicates that the
     * command was processed successfully and is an update count giving the
     * number of rows in the database that were affected by the command's
     * execution
     * <LI>A value of <code>SUCCESS_NO_INFO</code> -- indicates that the command was
     * processed successfully but that the number of rows affected is
     * unknown
     * <P> 
     * If one of the commands in a batch update fails to execute properly,
     * this method throws a <code>BatchUpdateException</code>, and a JDBC
     * driver may or may not continue to process the remaining commands in
     * the batch.  However, the driver's behavior must be consistent with a
     * particular DBMS, either always continuing to process commands or never
     * continuing to process commands.  If the driver continues processing
     * after a failure, the array returned by the method
     * <code>BatchUpdateException.getUpdateCounts</code>
     * will contain as many elements as there are commands in the batch, and
     * at least one of the elements will be the following:
     * <P> 
     * <LI>A value of <code>EXECUTE_FAILED</code> -- indicates that the command failed
     * to execute successfully and occurs only if a driver continues to
     * process commands after a command fails
     * </OL>
     * <P>
     * A driver is not required to implement this method.
     * The possible implementations and return values have been modified in
     * the Java 2 SDK, Standard Edition, version 1.3 to
     * accommodate the option of continuing to proccess commands in a batch
     * update after a <code>BatchUpdateException</code> obejct has been thrown.
     *
     * @return an array of update counts containing one element for each
     * command in the batch.  The elements of the array are ordered according 
     * to the order in which commands were added to the batch.
     * @exception SQLException if a database access error occurs or the
     * driver does not support batch statements. Throws {@link BatchUpdateException}
     * (a subclass of <code>SQLException</code>) if one of the commands sent to the
     * database fails to execute properly or attempts to return a result set.
     * @since 1.3
     */

通过Statement.addBatch(String sql)来添加sql,组成了batch。batch还是jdbc2.0产生的新事物。
既然addBatch是添加的语句,没有对insert做特别声明,看来应该也是支持的。
如何实现insert的操作简化的呢?这个目前还是不晓得,以后再研究罢。
batch参考代码:
boolean isSupportBatchUpdates(Connection conn)
   DatabaseMetaData dbm = con.getMetaData();
   if(dbm.supportBatchUpdates())
     return true;
   //notice: catch SQLException,AbstractMethodError
   return false;

int[] batchUpdate(String[] sql)
   //make sure sql is not null!!!
   int res = new int[sql.length];
   if(isSupportBatchUpdates(conn)){
      for(int i = 0;i<sql.length;i++)
        stmt.addBatch(sql[i]);
      res = stmt.executeBatch();
   } else {
      for(int i = 0 ;i<sql.length;i++){
         if(!stmt.execute(sql[i])) //非select,DML/DDL
            res[i] = stmt.getUpdateCount();
         else throw new ....
      }
   }
   return res;





分享到:
评论

相关推荐

    批量抓取网站验证码

    Jsoup的设计理念是使开发者能够以人类可读的方式来处理网页内容,这使得它在网页抓取和数据提取领域非常实用。 **验证码抓取原理** 抓取网站验证码通常涉及到网络请求、HTML解析和图像处理三个步骤。首先,需要模拟...

    python爬虫项目——自动批量抓取m3u8网页视频

    总的来说,这个Python爬虫项目展示了如何结合网络请求、HTML解析、文件下载和多媒体处理等技术,实现自动抓取和合成m3u8网页视频。通过学习和实践此类项目,开发者不仅可以提升自己的Python编程能力,还能深入理解...

    一个可以批量抓取网页图片的工具

    本程序可以抓取指定IE窗口中已下载完毕的网页中的全部或部分图片(可根据图片文件后缀和图片所属站点的域名过滤,也可以对单个图片进行选取),对于选中的图片,可以: 1)抓取文件URL列表,可以转换为UBB代码或HTML...

    [Windows版 / Mac 版] 万能嗅探1.0.5【可抓视频号】免安装 批量抓取媒体文件下载

    [Windows版 / Mac 版] 万能嗅探1.0.5【可抓视频号】免安装 批量抓取媒体文件下载 [Windows版 / Mac 版] 万能嗅探1.0.5【可抓视频号】免安装 批量抓取媒体文件下载 [Windows版 / Mac 版] 万能嗅探1.0.5【可抓视频号】...

    Python 批量抓取help()函数的帮助文档

    这些文档的批量抓取和整理对于深入理解和学习这些库的功能和用法大有裨益。 首先,`sympy`是一个用于符号数学的Python库,它提供了解决代数方程、微积分、矩阵运算等功能。`help045_sympy.txt`可能包含有关如何使用...

    C#写的新浪微博批量抓取器

    在本项目中,C#的这些特性被充分利用,以实现对微博数据的高效抓取和处理。 2. Web API和OAuth认证: 微博批量抓取器需要与新浪微博的API进行交互,这通常涉及OAuth认证流程。OAuth是一种授权协议,允许第三方应用...

    day36 08-Hibernate抓取策略:批量抓取

    为了解决这个问题,Hibernate提供了几种抓取策略,包括批量抓取和预加载。 批量抓取允许我们在一次查询中获取多个关联对象,而不是逐个加载。例如,如果我们有一个`User`实体,每个用户都有多个`Order`,我们可以...

    批量抓取日落时刻数据python

    该段代码可以实现批量抓取日落时刻数据。方便提取网站的数据。

    在多媒体文件中批量抓取图象.rar_源码

    后者很可能是源代码文件本身,可能以某种编程语言编写,并且包含了实现批量抓取图像的函数和逻辑。 在实际应用中,这样的工具可以用于各种场景,比如视频截图、动画帧提取、图像分析前的数据预处理等。开发者可能会...

    delphi 批量抓取页面E-MAIL 源码

    总之,“delphi 批量抓取页面E-MAIL 源码”是一个结合了网络请求、HTML解析、正则表达式和多线程技术的实用工具,对于熟悉Delphi和正则表达式的开发者来说,这个项目提供了一个学习和实践的好机会。通过深入理解和...

    perl网络批量抓取配置工具

    在自动化网络配置管理中,TFTP服务器可以作为临时存储设备配置的地方,方便程序抓取和上传。 总的来说,这个Perl网络批量抓取配置工具集成了多种网络通信技术,通过自动化流程实现了网络设备配置的批量收集和变更,...

    批量抓取邮箱地址(EasyEmailExtractor) v1.1.rar

    《批量抓取邮箱地址:EasyEmailExtractor v1.1 使用详解》 在信息化时代,电子邮件作为重要的沟通工具,其重要性不言而喻。而如何有效地收集和管理大量的邮箱地址,成为了许多企业和个人的需求。EasyEmailExtractor...

    Hibernate中大量数据的更新

    Hibernate 提供了两种批量更新机制:一级缓存(First-Level Cache)和批量抓取(Batching)。 一级缓存 Hibernate 的一级缓存是指 Session 对象中缓存的所有对象。在批量更新时,如果不及时清除一级缓存,可能会...

    批量PDF内容抓取工具 PDF关键字抓取 PDF文本识别

    批量pdf文字抓取工具 1、本工具使用的是腾讯的高准确率识别引擎,必须联网使用,且引擎不断升级更新。 2、腾讯会免费赠送识别次数,免费识别次数用完请联系本人购买。 3、微信/手机联系方式:18211420681。 使用...

    网页批量截图工具

    3. 数据抓取和存档:对于需要长期保存网页内容的项目,如学术研究或新闻跟踪,批量截图可以方便地建立网页快照库。 4. 教学和培训材料制作:教师或培训师可以快速获取网页教学资源,创建图文并茂的学习资料。 ...

    网页图片抓取/批量保存

    总的来说,网页图片抓取和批量保存涉及多种技术和工具,从浏览器插件到编程方法,再到专业软件,每种方式都有其适用场景和优缺点。合理选择和使用这些工具,能帮助我们更有效地管理和利用网络上的图片资源。

    Java爬虫技术分享:CSDN文章批量抓取方法.zip

    在本案例中,我们讨论的是如何使用Java实现对CSDN(China Software Developer Network)网站上的文章进行批量抓取。CSDN作为中国最大的IT社区,拥有丰富的技术文章资源,对于开发者来说,批量获取这些文章可以用于...

    C#开发Winform百度快照索引link和百度快照Cache批量抓取工具

    第一,由于网站技术人员疏忽,在网站改版后未将原网站的所有链接进行保存,从而SEO人员没办法获取到旧网站已弃用的URL进行站长资源平台的死链提交,于是做这样的工具进行批量的快照链接抓取,以便于SEO人员进行改版...

    一米URL外链资源批量抓取工具v2016.08.10官方中文绿色版

    一米URL外链资源批量抓取工具是一款支持谷歌百度等绝大多数搜索引擎脚本(footprint)抓取URL,快来下载体验吧! 软件功能特点 谷歌百度等绝大多数搜索引擎脚本(footprint)抓取URL; 支持手工浏览器获取url,自动过滤...

Global site tag (gtag.js) - Google Analytics