`
liyx985
  • 浏览: 214888 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

关于批量作业中遇到的问题

阅读更多

最近在做一个分布式批处理项目,业务逻辑复杂,数据量200万左右,处理过程大概如下:

1.查询满足条件的单子,并将计算、判断需要的基础数据查出来(批量查出来,当然查询过程中有做数据的分布式,不然一次性查出来不现实,这里不做赘述);

2.根据查询的数据计算出结果;

3.对需要提交的数据进行加锁操作

4.重新查询基础数据,与之前查询的数据进行对比,检查数据是否有改变,如果数据有变化,则将数据丢掉,本次计算不生效(可能大家有疑问,为什么不一开始就进行锁表操作呢?因为还有频繁的实时业务对于数据进行操作,所以要尽量是锁表的时间缩短)

5.批量提交

对于第四个点有两个地方比较耗时,1.现在已知单号,要根据单号查询数据,不能够根据单号一条一条查询,这样每次都与数据库有交互,很慢,那需要批量查询出来,可能有人想到用in,但是有一个问题in的参数有限制,对于oracle是1000,那怎么办?请参考文章https://blog.csdn.net/tiantiandjava/article/details/80205821(经过实测发现文章里提到的函数的参数有4000字符的限制,由于我们的参数比较长,故采用了in()or in().....形式,在java端进行拼写sql)

2.数据已经批量查出来,是两个集合,如何比较呢?参考https://blog.csdn.net/has330338724/article/details/50532901(注意集合里是对象的话,如果想用equal方法,需要重写hashcode方法和equal方法)

对于第5点,参考https://blog.csdn.net/codejas/article/details/79536863

https://blog.csdn.net/qq_15003505/article/details/80428249

 

关于hashcode()和equal()

 

 hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?

 

     因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?

 

           因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:

 

         1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

         2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

 

所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

 

     这种大量的并且快速的对象对比一般使用的hash容器中,比如hashset,hashmap,hashtable等等,比如hashset里要求对象不能重复,则他内部必然要对添加进去的每个对象进行对比,而他的对比规则就是像上面说的那样,先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。

 

      然而hashCode()和equal()一样都是基本类Object里的方法,而和equal()一样,Object里hashCode()里面只是返回当前对象的地址,如果是这样的话,那么我们相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的hashCode()不同,所以这显然不是我们想要的,所以我们必须重写我们类的hashCode()方法,即一个类,在hashCode()里面返回唯一的一个hash值,比如下面:

自定义一个类 

class Person{

   int num;

   String name;

 

   public int hashCode(){

      return num*name.hashCode();

}

}

 

由于标识这个类的是他的内部的变量num和name,所以我们就根据他们返回一个hash值,作为这个类的唯一hash值。

 

 

所以如果我们的对象要想放进hashSet,并且发挥hashSet的特性(即不包含一样的对象),则我们就要重写我们类的hashCode()和

equal()方法了。像String,Integer等这种类内部都已经重写了这两个方法。

 

当然如果我们只是平时想对比两个对象 是否一致,则只重写一个equal(),然后利用equal()去对比也行的。

 

哈希码(HashCode)

哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。

 

什么是哈希码(HashCode)

在Java中,哈希码代表对象的特征。
例如对象 String str1 = “aa”, str1.hashCode= 3104
String str2 = “bb”, str2.hashCode= 3106
String str3 = “aa”, str3.hashCode= 3104
根据HashCode由此可得出str1!=str2,str1==str3
下面给出几个常用的哈希码的算法。
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

 

分享到:
评论

相关推荐

    网络无纸化作业真的能够取代传统作业吗?

    试卷与习题可以输出到Word文件中,同时满足传统的考试和作业模式,并解决了特殊公式、符号的录入问题。 最后,整个教学环节可以系统地配套解决(学习诊断——备课——教学——作业——辅导——考试),整个作业流程...

    Python学生管理系统(毕业设计&大作业)

    在这里输入本数据库中已经存在的一个表格名称,程序将自动跳转到该表格,您可以在新的表格中继续操作(前提是您的账号需要有该表格的权限)。要获得权限,可以使用菜单栏中的协作功能,使用有权限的账号登陆系统后...

    hpc_batch:通过批处理控制HPC服务上的作业,以减少资源延迟

    批量碳酸盐作业概述使用IU的HPC环境提交作业的... 批量作业:这些是针对多个对象运行的工作流,作为测试的一部分或通过AMP运行整个集合。 请求之间的时间跨度可能为几秒钟。 当前的实现是作业提交和HPC调用之间的1:1关

    Google Search Console - 批量删除网址-crx插件

    使用此扩展程序,您只需单击一次按钮,即可在Google Search Console中批量删除网址。创建一个CSV文件,包括你想要删除的网址,上载此文件,取代你一次又一次的复制粘贴的麻烦。想要了解CSV格式的资讯,请参阅 ...

    BSP系统中基于多等待队列的作业调度算法

    在以前的BSP(批量同步并行)系统中,作业调度都是采用基于单个的优先级调度策略。它的优点是实现简单,但作业维护维护量大,低优先级作业存在无限等待的问题。提出了针对BSP系统的多等待分级的按优先级作业调度算法...

    柔性作业车间的任务分配及优化方法 (2010年)

    针对柔性作业车间中存在的多工艺路线和多加工路径的生产条件,以整个任务的加工时间最小化为目标,提出了有限缓冲条件下的任务分配模型。基于Wardrop用户平衡原理,利用增量分配法求解该模型,进而求解各路径和各...

    川农《计算机操作系统(本科)》17秋在线作业.docx

    A死锁的防止 B死锁的避免 C死锁的检测 D死锁的防止、避免和检测的混合 正确答案是:D 75分在批处理兼分时系统中,对( )应该及时相应,使用户满意 A批量作业 B前台作业 C后台作业 D网络通信 正确答案是:B 85分在...

    煤矿探水卸杆动作识别研究

    针对煤矿井下探水作业监工人员通过观看视频来监控卸杆作业的方式存在效率低下且极易出错的问题,提出利用三维卷积神经网络(3DCNN)模型对探水作业中的卸杆动作进行识别。3DCNN模型使用3D卷积层自动完成动作特征提取...

    Python实现跨平台批量运维小工具 基于多线程可实现多主机并行;基于docopt提供详细的命令行界面+源代码+文档说明

    - 要同时支持并行和串行:抽象出多线程模型,将串行视为多线程中只有一个线程的特例,解决多线程输出乱序问题 - 文件传输功能:由于ssh的sftp子系统只支持单个文件传输,所以需要以递归思想传输目录;尽量减少无谓...

    TCP/IP的以太网LCD电子标签系统设计

    在实际的生产作业中,对小批量、多品种、高频率货物的处理始终是一个难题。现有电子标签系统在控制上都是采用现场总线技术。但这种技术在信息集成方面存在许多不足。解决同一控制系统中多种现场总线的集成问题,在...

    网上考试系统

    6、实验指导:教师把学生在实验中遇到的问题和易犯的错误以回答问题的形式表现出来,以交互的形式辅导学生顺利完成实验;学生可以在计算机上撰写、提交实验报告,教师可以浏览、批阅。通过internet完成系统的登录,...

    一种面向BSP系统的多等待队列作业调度算法

    它的优点是实现简单,但作业队列维护开销大,低优先级作业存在无限等待的问题。论文提出了面向BSP系统基于多等待队列的按优先级作业调度算法,以高响应比优先级队列为作业组织方式,并加入了作业优先级的动态调整策略,...

    IssueManager:redmine 的问题管理器

    关于问题管理器功能概述它是一种将来自外部 Excel 的票证从模板注册到名为 redmine 的 BTS 系统的工具。我遇到的问题起初我使用的是插件,但我遇到了一些问题。内容不能被破坏自动注册比批量难*.xsl不支持*.xsl无法...

    SQL SERVER 2000开发与管理应用实例

    本书不但融合了作者在使用SQL Server 2000过程中遇到的各种常见问题和应用案例,还总结了作者几年来在CSDN 社区SQL Server版所解决的大量问题,面向实际项目需求,涉及不同类型的应用,能够多角度地引导读者学习相关...

    最新IPQC培训资料.doc

    制程不良统计区分: 依不良品产生之来源区分如下: (1) 作业不良 A: 作业失误 (人,法) B: 管理不良 (人) C: 设备问题 (机) D: 其它原因所致不良 (2) 物料不良 (物) A: 来料中原有存在的不良 B:前工序加工...

    批量微信小程序access_token 统一管理, 自动整合自动发送客服消息任务(也可方便的整合其他微信接口)。.zip

    如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的)。另外,您不会使用资源的话(这种情况不支持退款),也可以找我们帮助(需要...

    Altium Designer Beta 19.0.10完整版安装包+安装教程+和谐文件

    修复了在特定电路板设计中启动交互式路由器时存在很长延迟的问题。 25982 为焊盘和过孔添加并集成了新的热释放选项。 26034 修复了“PCB列表”面板“智能编辑”功能中的错误,其中“批量替换”功能无效。 26128 增加...

    sqlserver2000基础(高手也有用)

    14.3.1 批量处理数据库中的对象 444 14.3.2 将所有的char、varchar改为nchar、nvarchar 445 14.3.3 标识列与普通列的相互转换 447 14.3.4 把列添加指定位置 450 14.3.5 在两个SQL Server数据库之间复制对象...

    富士通扫描软件scandall pro part2

    输出的图像文件,可保存为JPEG7格式,也可压缩到JBIG格式以便存在较小的文件夹中。 原文出自【比特网】,转载请保留原文链接:http://oa.chinabyte.com/77/12379577.shtml 安装方法:把PART1,PART2解压到同一...

    IPQC培训资料.docx

    制程不良统计区分: 依不良品产生之来源区分如下: (1) 作业不良 A: 作业失误 (人,法) B: 管理不良 (人) C: 设备问题 (机) D: 其它原因所致不良 (2) 物料不良 (物) A: 来料中原有存在的不良 B:前工序加工...

Global site tag (gtag.js) - Google Analytics