掌桥专利:专业的专利平台
掌桥专利
首页

批量遍历数据库方法、系统、控制装置及存储介质

文献发布时间:2023-06-19 19:30:30


批量遍历数据库方法、系统、控制装置及存储介质

技术领域

本发明涉及数据处理技术领域,具体提供一种批量遍历数据库方法、系统、控制装置及存储介质。

背景技术

在现有的商业行为中,以常见的电商“第三方支付”模式为例,其中就存在着典型的支付清结算场景与需求。其中,用户确认收货后,第三方支付平台根据清算结果将款项转至卖家的银行账户上,这一过程是结算。

针对现有的结算方法,第三方支付平台需要执行商户定点跑批的操作,也就是清算系统根据商户自定义清算时间,从数据库中遍历需要执行跑批的商户数。而现有技术在处理上述过程时,一般利用ORM框架(Mybatis)通过分页的方式从数据库中获取数据,并开启多线程对每页的数据进行处理,最后利用CountDownLatch来保证所有数据都能跑完。

假设商户数为400W条,那么每页一万条数据,就需要查询400W次,上述处理方法存在以下问题:

(1)每页获取的1万条数据需要放到内存中,造成系统中存在许多大对象,影响性能。

(2)随着分页页数的深入,当数据量查询到一百万左右的时候,每页的查询耗时就达到了30秒以上,后边的每页耗时肯定还会更长。造成系统与数据库之间同时存在大量连接,消耗资源并且耗时增加,并可能后影响到系统其他SQL的查询性能,造成多个业务SQL查询耗时增加。

(3)每个线程处理1万条数据,会同时存在多个线程同时处理的情况,且因为每个线程处理的条数较多,造成系统存在许多大对象并频繁的进行线程的切换,性能下降。

(4)人工利用CountDownLatch对象来保证所有数据处理完,就需要获取总页数以及总条数,而总条数的计算就得在重新开一个查询,造成无故的性能损耗。

因此,现有技术在处理数据量大的跑批任务时,会造成服务器cpu的使用率飙升,内存消耗上升,总体需要在半个小时到一个小时之间才能跑批完成。

发明内容

为了克服上述缺陷,提出了本发明,以提供解决或至少部分地解决现有技术在处理数据量大的跑批任务时,会造成服务器cpu的使用率飙升,内存消耗上升的技术问题。

在第一方面,本发明提供一种批量遍历数据库方法,用于对数据库执行数据获取,所述数据库存储有待获取数据,

所述方法包括:

S1:利用原生的JDBC技术,通过数据库的连接池创建Connection对象;

S2:利用Connection对象创建一个单向向前读取数据的PreparedStatement对象;

S3:利用PreparedStatement对象中的executeQuery方法进行数据库查询。

在上述批量遍历数据库方法的一个技术方案中,所述步骤S2包括:

S21:通过Connection对象创建PreparedStatement对象;

S22:设置PreparedStatement对象为单向向前读取数据;

S23:设置PreparedStatement对象查询数据库中所有待获取数据的允许时长。

在上述批量遍历数据库方法的一个技术方案中,所述步骤S3包括:

S31:在PreparedStatement对象内生成能持续从数据库中获取数据的迭代器Resultset,对数据库进行查询;

S32:通过迭代器ResultSet遍历数据库中所有待获取的数据;

S33:调用每条待获取的数据所对应的业务处理流程;

S34:根据业务处理流程为每条待获取的数据构建FutureTask对象;

S35:由线程池执行每个FutureTask对象的get方法,并获取返回值。

在上述批量遍历数据库方法的一个技术方案中,所述数据库的连接池在创建好后,由springboot进行管理。

在上述批量遍历数据库方法的一个技术方案中,所述步骤S2还包括,S24:设置Connection对象的每一线程获取数据数量;

所述方法还包括,

S4:累计获取的返回值数量,直到所述返回值达到预设每一线程获取数据数量;

S5:更新已获取数据的信息表。

在上述批量遍历数据库方法的一个技术方案中,所述步骤S5包括:

S51:创建jdbctemplate对象;

S52:设置更新数据源,对所述已获取数据的信息表进行更新。

在上述批量遍历数据库方法的一个技术方案中,所述FutureTask对象在创建好后,由线程池进行处理。

在第二方面,本发明提供一种批量遍历数据库系统,用于对数据库执行数据获取,所述数据库存储有待获取数据,包括:

第一构建单元,用于利用原生的JDBC技术,通过数据库的连接池创建Connection对象;

第二构建单元,用于利用Connection对象创建一个单向向前读取数据的PreparedStatement对象;

查询单元,用于利用PreparedStatement对象中的executeQuery方法进行数据库查询。

在第三方面,提供一种控制装置,该控制装置包括处理器和存储装置,所述存储装置适于存储多条程序代码,所述程序代码适于由所述处理器加载并运行以执行上述批量遍历数据库方法的技术方案中任一项技术方案所述的批量遍历数据库方法。

在第四方面,提供一种计算机可读存储介质,该计算机可读存储介质其中存储有多条程序代码,所述程序代码适于由处理器加载并运行以执行上述批量遍历数据库方法的技术方案中任一项技术方案所述的批量遍历数据库方法。

本发明上述一个或多个技术方案,至少具有如下一种或多种有益效果:

在实施本发明的技术方案中,通过构建两个对象,并采取executeQuery方法进行数据库查询,因不需要将查询结果放在内存中的数据,而是通过对迭代器进行遍历从数据库中获取真正的数据。可以快速的对大批量数据进行遍历,并且不需要分页,这样可以提高数据读取的效率并且减少内存空间的使用,还可以减少大对象的出现。

附图说明

参照附图,本发明的公开内容将变得更易理解。本领域技术人员容易理解的是:这些附图仅仅用于说明的目的,而并非意在对本发明的保护范围组成限制。此外,图中类似的数字用以表示类似的部件,其中:

图1是根据本发明的实施例1的批量遍历数据库方法的主要步骤流程示意图;

图2是根据本发明的实施例1的批量遍历数据库方法中步骤S2的主要步骤流程示意图;

图3是根据本发明的实施例1的批量遍历数据库方法中步骤S3的主要步骤流程示意图;

图4是根据本发明的实施例2中批量遍历数据库系统的主要结构框图示意图;

图5是根据本发明的实施例3中控制装置的主要结构框图示意图。

具体实施方式

下面参照附图来描述本发明的一些实施方式。本领域技术人员应当理解的是,这些实施方式仅仅用于解释本发明的技术原理,并非旨在限制本发明的保护范围。

在本发明的描述中,“模块”、“处理器”可以包括硬件、软件或者两者的组合。一个模块可以包括硬件电路,各种合适的感应器,通信端口,存储器,也可以包括软件部分,比如程序代码,也可以是软件和硬件的组合。处理器可以是中央处理器、微处理器、图像处理器、数字信号处理器或者其他任何合适的处理器。处理器具有数据和/或信号处理功能。处理器可以以软件方式实现、硬件方式实现或者二者结合方式实现。非暂时性的计算机可读存储介质包括任何合适的可存储程序代码的介质,比如磁碟、硬盘、光碟、闪存、只读存储器、随机存取存储器等等。术语“A和/或B”表示所有可能的A与B的组合,比如只是A、只是B或者A和B。术语“至少一个A或B”或者“A和B中的至少一个”含义与“A和/或B”类似,可以包括只是A、只是B或者A和B。单数形式的术语“一个”、“这个”也可以包含复数形式。

在本文中用到的方位术语如“前”、“前侧”、“前部”、“后”、“后侧”和“后部”等均以部件安装至车辆后车辆的前后方向为基准。在本文中提到的“纵”、“纵向”、“纵截面”均以部件安装至车辆后的前后方向为基准,而“横”、“横向”、“横截面”则表示垂直于纵向方向。

现有电商购物时,对于第三方支付平台根据清算结果将款项转至卖家的银行账户上的这一结算过程,具体是通过以下步骤实现:

①商户结算方式的设置:用户系统向清算系统发出请求,将商户加入清算商户名单,设置商户清算时间,清算系统对该商户进行标记;

②商户交易资金记账:交易系统向账务系统发起商户的每笔交易资金记账请求;

③商户定点跑批:清算系统根据商户自定义清算时间,从数据库中遍历需要执行跑批的商户数(例如400万商户);

④商户提现资金冻结:清算系统按每批1w商户对资金结算风险检查,并冻结商户结算资金;

⑤商户结算:到正常的付款时间,清算系统请求银网联对商户结算卡付款。

在商户定点跑批和商户提现资金冻结两步中,需要清算系统遍历数据库中的所有数据,如果数据量较大,通过分页的方式查询数据存在诸多问题。

实施例1

为此,本发明提出一种批量遍历数据库方法,用于对数据库执行数据获取,所述数据库存储有待获取数据,如图1所示,本发明实施例中的批量遍历数据库方法主要包括以下步骤。

S1:利用原生的JDBC技术,通过数据库的连接池创建Connection对象。

在本实施例中,JDBC技术为Java封装的连接数据库的一个工具,通过数据库连接池单独创建Connection,其中Connection是Java的一个对象。

在一个具体实施例中,步骤S1的实现代码为:

Connection connection=queryDataSource.getConnection();

connection.setAutoCommit(true);此处表述设置connection参数为设置事务的自动提交,

S2:利用Connection对象创建一个单向向前读取数据的PreparedStatement对象。

本实施例中,PreparedStatement是JDBC的一个对象。

S3:利用PreparedStatement对象中的executeQuery方法进行数据库查询。

在本实施例中,通过构建两个对象,并采取executeQuery方法进行数据库查询,因不需要将查询结果放在内存中的数据,而是通过对迭代器进行遍历从数据库中获取真正的数据。可以快速的对大批量数据进行遍历,并且不需要分页,这样可以提高数据读取的效率并且减少内存空间的使用,还可以减少大对象的出现。

进一步,如图2所示,所述步骤S2包括:

S21:通过Connection对象创建PreparedStatement对象。

在一个具体实施例中,步骤S21的实现代码为:

PreparedStatement preparedStatement=connection.prepareStatement(querySql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

S22:设置PreparedStatement对象为单向向前读取数据。

本实施例中,设置数据读取方向,例如读取到第100万个数据,如果此处不设置仅允许向前,意味着系统需要创建额外的对象来帮助向后查询(例如查询第50条数据),会导致查询速度变慢。这是preparedstatement允许的设置,支持向前查询、向后查询、双向查询,目的是照顾某些场景,但在本方案中仅需要向前查询,即查询第100万之后的,故此处设置仅允许向前查询。

在一个具体实施例中,步骤S22的实现代码为:

preparedStatement.setFetchDirection(ResultSet.FETCH_FORWARD);

S23:设置PreparedStatement对象查询数据库中所有待获取数据的允许时长。

在一个具体实施例中,步骤S23的实现代码为:

preparedStatement.setFetchSize(limit);

preparedStatement.setQueryTimeout(limit);

进一步,所述步骤S3包括:

S31:在PreparedStatement对象内生成能持续从数据库中获取数据的迭代器Resultset,对数据库进行查询。

在本实施例中,生成能够持续从数据库中获取数据的迭代器,并没有真正的把400万条数据拿过来,而是相当于建立了一个与数据库的通道,执行该条resultset语句时,告知数据库要获取哪些数据并在数据的起始处添加标识。

在一个具体实施例中,步骤S31的实现代码为:

ResultSet resultSet=preparedStatement.executeQuery();

其中,所述数据库的连接池在创建好后,由springboot进行管理。

S32:通过迭代器ResultSet遍历数据库中所有待获取的数据。

在一个具体实施例中,步骤S32的实现代码为:

while(resultSet.next()){

S33:调用每条待获取的数据所对应的业务处理流程。

在本实施例中,所述业务处理流程包括生成结算单、校验金额等等。通过调用业务处理流程,将数据库中的数据转换成业务处理所需要的对象。

在一个具体实施例中,步骤S33的实现代码为:

MecSettleInfDto mecSettleInfDto=this.initMecSettleInfDto(resultSet);

其中,本条代码实现的是数据与业务处理对象之间的转换,调用步骤的代码见下文中的autoSettleItemProcessor.process(mecSettleInfDto)。

S34:根据业务处理流程为每条待获取的数据构建FutureTask对象。

在本实施例中,具体是将每条对象的业务处理流程构造出JUC包下的FutureTask对象,其中JUC包是java的一个并发包。

在一个具体实施例中,步骤S34的实现代码为:

FutureTasktask=new FutureTask<>(()->autoSettleItemProcessor.process(mecSettleInfDto));

S35:由线程池执行每个FutureTask对象的get方法,并获取返回值。

在本实施例中,所述FutureTask对象在创建好后,由线程池进行处理,并同时设置返回值(SesSetBatInfDto)。

在本实施例中,用此对象的get方法获取返回值,此方法的一个重要的功能是它只有在当前FutureTask对象执行完对应的逻辑以后才能拿到返回值,如果业务流程没有执行完,那FutureTask所在的线程就会等待业务逻辑执行完成后获取返回值,通过此方法可以保证主线程(即执行查询数据库的步骤的线程)只要执行完所有的FutureTask对象的get方法,就能确定所有的数据已经处理完成。这样可以让我们不在主动的控制所有的线程执行完以后再进行后续的处理,从而可以舍弃CountDownLatch。进一步减少大对象的使用,提升性能。

在一个具体实施例中,步骤S35的实现代码为:

future.get()

在现有方式中,处理1万条数据,交给一个线程进行处理,不可能短时间内把1万条数据同时处理完,则无法避免线程上下文的切换,这中间会创建很多个对象,耗时、耗内存。每个线程处理1万条数据,会同时存在多个线程同时处理的情况,且因为每个线程处理的条数较多,造成系统存在许多大对象并频繁的进行线程的切换,性能下降。

本实施例中,每遍历一条数据就交给线程池通过新的线程进行处理,进一步的减少了大对象的出现,并且因为单条数据的处理时效非常的快,减少了线程之间切换的时间消耗,这里面不仅可以减少时间,还可以提升性能,因为线程之间进行切换是很耗费资源的一件事

进一步,在获取返回值后,实际中,业务需要更新跑批信息表,所述步骤S2还包括,

S24:设置Connection对象的每一线程获取数据数量;

在一个具体实施例中,步骤S32的实现代码为:

preparedStatement.setFetchSize(limit);

本实施例中,limit的值可以设置为10000,即每执行完一万条更新一次跑批时间和跑批状态,相比于执行完400万条后再更新,更新信息表的耗时短,所占内存小。

所述方法还包括,

S4:累计获取的返回值数量,直到所述返回值达到预设每一线程获取数据数量。

在一个具体实施例中,步骤S4的实现代码为:

在本实施例中,if判断是在执行完1万条数据后对相关信息表进行更新操作,利用了JdbcTemplate的batchUpdate方法进行更新,避免使用Mybatis的更新方法,提升了效率,减少了耗时。在处理完成以后将相关的对象清空。

S5:更新已获取数据的信息表。

S51:创建jdbctemplate对象,设置更新数据源。

在一个具体实施例中,步骤S51的实现代码为:

JdbcTemplate jdbcTemplate=new JdbcTemplate();

jdbcTemplate.setDataSource(writeDataSource);

S52:对所述已获取数据的信息表进行更新。

在一个具体实施例中,步骤S52的实现代码为:

/>

需要指出的是,尽管上述实施例中将各个步骤按照特定的先后顺序进行了描述,但是本领域技术人员可以理解,为了实现本发明的效果,不同的步骤之间并非必须按照这样的顺序执行,其可以同时(并行)执行或以其他顺序执行,这些变化都在本发明的保护范围之内。

实施例2

如图4所示,本发明还提供了一种批量遍历数据库系统,用于对数据库执行数据获取,所述数据库存储有待获取数据,包括:

第一构建单元,用于利用原生的JDBC技术,通过数据库的连接池创建Connection对象;

第二构建单元,用于利用Connection对象创建一个单向向前读取数据的PreparedStatement对象;

查询单元,用于利用PreparedStatement对象中的executeQuery方法进行数据库查询。

上述批量遍历数据库系统以用于执行图1所示的批量遍历数据库方法实施例,两者的技术原理、所解决的技术问题及产生的技术效果相似,本技术领域技术人员可以清楚地了解到,为了描述的方便和简洁,批量遍历数据库系统的具体工作过程及有关说明,可以参考批量遍历数据库方法的实施例所描述的内容,此处不再赘述。

本领域技术人员能够理解的是,本发明实现上述一实施例的方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读存储介质可以包括:能够携带所述计算机程序代码的任何实体或装置、介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器、随机存取存储器、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读存储介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读存储介质不包括电载波信号和电信信号。

实施例3

如图5所示,本发明还提供了一种控制装置。在根据本发明的一个控制装置实施例中,控制装置包括处理器和存储装置,存储装置可以被配置成存储执行上述方法实施例的批量遍历数据库方法的程序,处理器可以被配置成用于执行存储装置中的程序,该程序包括但不限于执行上述方法实施例的批量遍历数据库方法的程序。为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明实施例方法部分。该控制装置可以是包括各种电子设备形成的控制装置设备。

实施例4

本发明还提供了一种计算机可读存储介质。在根据本发明的一个计算机可读存储介质实施例中,计算机可读存储介质可以被配置成存储执行上述方法实施例的批量遍历数据库方法的程序,该程序可以由处理器加载并运行以实现上述批量遍历数据库方法。为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明实施例方法部分。该计算机可读存储介质可以是包括各种电子设备形成的存储装置设备,可选的,本发明实施例中计算机可读存储介质是非暂时性的计算机可读存储介质。

进一步,应该理解的是,由于各个模块的设定仅仅是为了说明本发明的装置的功能单元,这些模块对应的物理器件可以是处理器本身,或者处理器中软件的一部分,硬件的一部分,或者软件和硬件结合的一部分。因此,图中的各个模块的数量仅仅是示意性的。

本领域技术人员能够理解的是,可以对装置中的各个模块进行适应性地拆分或合并。对具体模块的这种拆分或合并并不会导致技术方案偏离本发明的原理,因此,拆分或合并之后的技术方案都将落入本发明的保护范围内。

至此,已经结合附图所示的优选实施方式描述了本发明的技术方案,但是,本领域技术人员容易理解的是,本发明的保护范围显然不局限于这些具体实施方式。在不偏离本发明的原理的前提下,本领域技术人员可以对相关技术特征作出等同的更改或替换,这些更改或替换之后的技术方案都将落入本发明的保护范围之内。

技术分类

06120115937188