ADO两个线程中的查询使用同一个数据连接为什么能够异步执行

ADO两个线程中的查询使用同一个数据连接为什么能够异步执行,第1张

在adonet 20中可用异步命令试试。为了启用异步命令必须在连接字符串中把Async属性设置为true,以下是一个异步 *** 作的例子:

//Begin executing the command

IAsyncResult ar=cmdBeginExecutereader(new AsyncCallback(ProcessData),cmd);

启动异步 *** 作以后,可以不管它而做任何其他工作。在该 *** 作结束时调用指定的回调函数。回调函数如下:

public void processData(IAsyncResult ar)

{

SqlCommand cmd=(SqlCommand)iarAsyncState;

SqlDataReader reader=cmdEndExecuteReader(iar);

}

1 概述

2 相关类介绍

3 同步复制原理

4 异步复制原理

5 注意事项

为了提供系统的可靠性,RocketMQ采用了主从复制机制,对于每个主Broker,可配置多个从Broker,主Broker接收生产者消息保存后,可通过同步或者异步的方式复制到从Broker,以此实现高可用。

采用同步复制,可以最大程度保证消息的可靠性,但是每次写消息都必须等待至少该消息被同步至一个从Broker中,因此也会影响系统吞吐量。异步复制则和同步复制正好相反,主Broker写完消息之后立刻返回,不用管该消息是否已经被复制到从Broker,因此吞吐量会高一点,但是如果在消息被复制到从Broker之前主Broker发生故障,那么有可能会造成未来得及复制到从Broker的信息丢失。

本文会简单介绍下RocketMQ主从同步的实现。

是主从复制服务的主要实现类,通过内部相关组件实现接受从Broker连接请求、记录从Broker上报的复制进度等功能。

主要负责接受从Broker的连接请求,接受到的每个从Broker的连接之后会新建 HAConnection 对象实例。

主Broker管理的一系列从Broker连接,内部持有一个 ReadSocketService 对象实例,负责接收从Broker定时上报的自己当前复制进度,也持有一个 WriteSocketService 负责在通道可写时向从Broker发送需要复制的数据,完成主从复制。

一个 ServiceThread 实现类,如果是从Broker,则会尝试向主Broker建立连接,并定时向主Broker汇报自己的复制进度,之后监听 OP_READ 事件(可参考笔者文章 NIO SelectionKey事件理解 ),处理主Broker通过 HAConnectionWriteSocketService 发送过来的需要复制的数据。

主从同步复制的实现类,如果是主从同步复制,则会向该类提交一个复制任务请求,并进入阻塞等待状态,该任务主要封装了当前主Broker的消息写进度, GroupTransferService 也是一个 ServiceThread ,会定时获取 HAConnectionReadSocketService 接受到的从Broker的最大复制进度,然后对比所有的复制任务请求,如果已经从Broker最大复制进度已经大于请求内的进度要求,则唤醒该同步复制阻塞,阻塞和唤醒是通过 CountDownLatch 实现的。

BrokerController 通过 DefaultMessageStoreputMessage 存储消息,后者则通过调用 CommitLogputMessage 进行实际的消息存储处理, CommitLogputMessage 在将消息写入内存缓冲之后会先调用 handleDiskFlush 进行同步或异步刷盘,之后会调用 handleHA 进行主从复制处理。

handlerHA 方法定义如下:

GroupTransferService 接受了复制等待请求任务之后会在 run 方法中定时查看从Broker上报的最大复制进度,会唤醒那些等待进度已达到的等待任务。

其实异步复制原理比较简单,如果Broker配置为异步复制,则在 CommitLogputMessage 写入消息之后,调用 handleHA 方法不会做任何 *** 作,写入之后根本不用管从Broker的复制进度,复制完全是由后台 HAConnectionWriteSocketService 服务在监听到有从Broker连接可写时,向其写待复制的数据。每个从Broker发送进度则由从Broker定时汇报的自身当前已复制进度控制,该汇报由 HAConnectionReadSocketService 负责处理,从Broker汇报上来的最大复制进度则用于第3节介绍的同步复制的等待复制任务阻塞的线程。

RocketMQ各组件通信比如Broker和Namesrv、Producer和Namesrv、Consumer和Namesrv、Producer以及Consumer和Broker之间的通信都是基于Netty实现的,但是本文介绍的主从复制实现中的网络交互都是基于原生Java NIO实现的。

这是正常的,异步处理都是这有问题。特别是数据库开启事务的时候,上一个线程还没有提交的话,其他事务是看不到数据的。解决的办法就是要么采用同步的机制,在同一个线程中处理数据,自然就不会存在这种问题。如果一定要用异步的话,可以加入等待机制,就是判断数据是否入库,没有点话就等待一会儿,然后在判断,直到入库才进行后续的处理

简单的说几句吧。其实这个解决方案呢,主要是要先考虑成本问题,其他的,技术问题其实都很容易解决,但是企业应用上,最大的限制就是成本。下面以ORACLE数据库为例,简单说说。希望对你有所帮助。(数据库类型并不重要,解决方案都是大同小异。)

1、基于存储层的容灾复制方案

这种技术的复制机制是通过基于SAN的存储局域网进行复制,复制针对每个IO进行,复制的数据量比较大;系统可以实现数据的同步或异步两种方式的复制。对大数据量的系统来说有很大的优势(每天日志量在60G以上),但是对主机、 *** 作系统、数据库版本等要求一致,且对络环境的要求比较高。

2、基于逻辑卷的容灾复制方案

这种技术的机制是通过基于TCP/IP的网络环境进行复制,由 *** 作系统进程捕捉逻辑卷的变化进行复制。其特点与基于存储设备的复制方案比较类似,也可以选择同步或异步两种方式,对主机的软、硬件环境的一致性要求也比较高,对大数据量的应用比较有优势。其目标系统如果要实现可读,需要创建第三方镜像。个人认为这种技术和上面提到的基于存储的复制技术比较适合于超大数据量的系统,或者是应用系统的容灾复制。

3、基于oracleredolog的逻辑复制方式

使用这种方式的主要有一些第三方的软件,以及oracle自己的DATAGUARD中的logicalStandby。目前,国外已经有了很多比较成熟的产品及成功案例,国内也有类似的产品,但在产品的成熟程度和成功案例上跟国外还有一定的差距。

使用oracle以外的独立进程,捕捉redologfile的信息,将其翻译成sql语句,再通过网络传输到目标端数据库,在目标端数据库执行同样的sql。如果其进程赶不上oracle日志切换,也可以捕捉归档日志中的内容。也有的产品在源端以事务为单位,当一个事务完成后,再把它传输到目标端。所有的产品一般都是以表为单位进行复制,同时也支持大部分DDL的复制(主要在oracle9i环境中)。

数据库的吞吐量太大时,其实据会有较大的延迟,当数据库每天的日量达到60G或更大时,这种方案的可行性交差;实施的过程可能会有一些停机时间,来进行数据的同步和配置的激活;复制环境建立起来以后,对数据库结构上的一些修改需要按照规定的 *** 作流程进行,有一定的维护成本。

以上就是关于ADO两个线程中的查询使用同一个数据连接为什么能够异步执行全部的内容,包括:ADO两个线程中的查询使用同一个数据连接为什么能够异步执行、RocketMQ源码-主从同步复制和异步复制、java异步处理数据时时数据还没存到库里等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10642404.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存