Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

server端会调用QueryTimeManager.killQuery()方法,设置查询的中断标记位为true,之后查询线程运行到设置的检查点时,会判断查询有没有被中断,如果被中断,则抛出QueryTimeoutRuntimeException异常,server捕获此异常后,调用releaseQueryResource释放查询资源。方法,设置查询的中断标记位为true,之后查询线程运行到设置的检查点时,会判断查询有没有被中断,如果被中断,则抛出QueryTimeoutRuntimeException异常,server捕获此异常后,调用releaseQueryResource释放查询资源,但是如果是不带值过滤的原始数据查询,主线程虽然随着连接断开,完成资源释放后而停止工作,但是由于这种查询是多线程并行的,会有多个异步的并行线程去读取数据,这些线程没有退出,依旧在后台运行。

这里也存在一个问题,若客户端连接此时没有断开,并且客户端也没有继续调用next(),则执行kill query命令,也没有办法清理查询资源,因为此时server端并没有活跃的线程与客户端对应,也就没有机会断查询有没有被中断。

查询超时,自动退出

若开启了查询超时功能,每个查询会有一个后台的定时线程,等待设定的查询超时的时长后,若此次查询还未结束,则将此次查询的中断标记位为true,之后查询线程运行到设置的检查点时,会判断查询有没有被中断,如果被中断,抛出QueryTimeoutRuntimeException异常,server捕获此异常后,调用releaseQueryResource释放查询资源。若开启了查询超时功能,每个查询会有一个后台的定时线程,等待设定的查询超时的时长后,若此次查询还未结束,则将此次查询的中断标记位为true,之后查询线程运行到设置的检查点时,会判断查询有没有被中断,如果被中断,抛出QueryTimeoutRuntimeException异常,server捕获此异常后,调用releaseQueryResource释放查询资源,但是如果是不带值过滤的原始数据查询,主线程虽然随着连接断开,完成资源释放后而停止工作,但是由于这种查询是多线程并行的,会有多个异步的并行线程去读取数据,这些线程没有退出,依旧在后台运行。


存在的问题

对于不带值过滤的原始数据查询而言

  1. 如果客户端未遍历完结果集就调用close方法,或异步读取数据的线程未结束前,客户端连接异常断开,则异步的读取线程无法退出,会一直占着资源。
  2. 如果用户执行kill query命令或查询超时,若中断标记位首先被主线程捕获,主线程抛出异常后,就会清除中断标记,导致异步读取数据的线程依旧无法退出;即使中断标记位首先被某一异步读取数据线程捕获,当前异步读取线程和主线程能够正常退出,但是该查询的其他异步读取线程也无法正常退出。
  3. 如果用户执行kill query命令,客户端连接此时没有断开,并且客户端也没有继续调用next(),则执行kill query命令,也没有办法清理查询资源,因为此时server端并没有活跃的线程与客户端对应,也就没有机会断查询有没有被中断。