ClickHouse / ClickHouse/clickhouse-java

clickhouse-http-client: how do I close the connection in case of an error?

Abierto
#1,712 3 comentarios 0 reacciones 0 asignados Ver en GitHub
area:network bug triaged usability
Lenguaje dominante
Java
Estrellas
1.6k
Forks
636
Merge medio
2 d 23 h
PR fusionados (30 d)
29

Descripción

### When the client cancels the request, the connection to the asynchronous request is not closed

I use **spring-boot** in combination with **clickhouse-http-client** and **Kotlin**
Library Version: **com.clickhouse:clickhouse-http-client:0.6.1**

### Steps to reproduce
1. If the client sends 10 read requests and cancels them, the limit in **max_open_connections** (ClickHouseHttpOption.MAX_OPEN_CONNECTIONS) will be reached, because, in fact, the connection will not be closed by anyone.

### Code example
```kotlin
package com.api.test

import com.clickhouse.client.ClickHouseClient
import com.clickhouse.client.ClickHouseNode
import com.clickhouse.data.ClickHouseFormat
import kotlinx.coroutines.future.await
import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import kotlin.coroutines.cancellation.CancellationException

@RestController
@RequestMapping("/test")
class TestApi(
private val clickHouseClient: ClickHouseClient,
private val clickhouseNode: ClickHouseNode,
) {
private val logger = LoggerFactory.getLogger(TestApi::class.java)

@GetMapping("/read")
suspend fun read() {
try {
val response = clickHouseClient.read(clickhouseNode)
.format(ClickHouseFormat.JSON)
.query("""SELECT sleep(3)""".trimIndent())
.execute()
.await()
response.close()
} catch (e: CancellationException) {
logger.error("Error", e)
// How do I close the connection?
}
}
}
```

### Question
ClickHouse has the **cancel_http_readonly_queries_on_client_close** option. But how can I use the library to initiate connection closure instead of waiting for a response? Or maybe I can cancel a previously sent request?

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza siguiendo el flujo de ClickHouseClient.read(...).execute() y la ruta de await de la coroutine utilizada en el ejemplo; después, inspecciona cómo se gestionan ClickHouseHttpOption.MAX_OPEN_CONNECTIONS y response.close() durante la cancelación. Reproduce las solicitudes canceladas y determina el comportamiento esperado de limpieza de la conexión y de la consulta del servidor.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
kotlin, spring-boot
Área
backend, databases
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
30/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.