Java-клиент
Клиентская библиотека Java для взаимодействия с сервером БД по его протоколам. Текущая реализация поддерживает только HTTP-интерфейс. Библиотека предоставляет собственный API для отправки запросов на сервер, а также инструменты для работы с различными форматами бинарных данных (RowBinary* & Native*).
Настройка
- Maven Central (веб-страница проекта): https://mvnrepository.com/artifact/com.clickhouse/client-v2
- Ночные сборки (ссылка на репозиторий): https://central.sonatype.com/repository/maven-snapshots/
- Старый Artifactory‑репозиторий ночных сборок (ссылка): https://s01.oss.sonatype.org/content/repositories/snapshots/
- Maven
- Gradle (Kotlin)
- Gradle
Инициализация
Объект Client инициализируется с помощью com.clickhouse.client.api.Client.Builder#build(). Каждый клиент имеет собственный контекст, объекты между клиентами не являются общими.
Builder предоставляет методы конфигурации для удобной настройки.
Пример:
Client реализует интерфейс AutoCloseable и его необходимо закрывать, когда он больше не нужен.
Аутентификация
Аутентификация настраивается для каждого клиента на этапе инициализации. Поддерживаются три метода аутентификации: по паролю, по токену доступа и по клиентскому SSL‑сертификату.
Для аутентификации по паролю необходимо задать имя пользователя и пароль, вызвав методы setUsername(String) и setPassword(String):
Для аутентификации по токену доступа необходимо задать его с помощью вызова setAccessToken(String):
Аутентификация по SSL-сертификату клиента требует указания имени пользователя, включения SSL-аутентификации, указания клиентского сертификата и клиентского ключа путем вызова методов setUsername(String), useSSLAuthentication(boolean), setClientCertificate(String) и setClientKey(String) соответственно:
Аутентификацию SSL может быть сложно диагностировать в продакшене, поскольку многие ошибки из библиотек SSL не предоставляют достаточно информации. Например, если клиентский сертификат и ключ не совпадают, сервер немедленно разорвет соединение (в случае HTTP это произойдет на этапе инициализации соединения, когда HTTP-запросы еще не отправлены и ответ не будет отправлен).
Для проверки сертификатов и ключей используйте инструменты вроде openssl:
- проверить целостность ключа:
openssl rsa -in [key-file.key] -check -noout - проверьте, что значение CN в клиентском сертификате соответствует имени пользователя:
- получить CN из пользовательского сертификата —
openssl x509 -noout -subject -in [user.cert] - проверить, что в базе данных задано то же значение
select name, auth_type, auth_params from system.users where auth_type = 'ssl_certificate'(запрос выведетauth_paramsсо значением вида{"common_names":["some_user"]})
- получить CN из пользовательского сертификата —
Конфигурация
Все настройки определяются методами экземпляра (также известными как методы конфигурации), которые четко определяют область видимости и контекст каждого значения. Основные параметры конфигурации определяются в одной области видимости (клиент или операция) и не переопределяют друг друга.
Конфигурация задаётся при создании клиента. См. com.clickhouse.client.api.Client.Builder.
Настройка клиента
- Подключение и точки подключения
- Аутентификация
- Тайм-ауты и повторные попытки
- Параметры сокетов
- Сжатие
- SSL и безопасность
- Прокси
- HTTP и заголовки
- Настройки сервера
- Часовой пояс
- Дополнительно
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
addEndpoint(String endpoint) | endpoint - адрес сервера в формате URL | Добавляет endpoint сервера в список доступных серверов. В настоящее время поддерживается только один endpoint. | none | none |
addEndpoint(Protocol protocol, String host, int port, boolean secure) | protocol - протокол подключенияhost - IP-адрес или имя хостаsecure - использовать HTTPS | Добавляет endpoint сервера в список доступных серверов. В настоящее время поддерживается только один endpoint. | none | none |
enableConnectionPool(boolean enable) | enable - флаг включения/отключения | Устанавливает, включен ли пул соединений | true | connection_pool_enabled |
setMaxConnections(int maxConnections) | maxConnections - число соединений | Устанавливает, сколько соединений клиент может открыть к каждому endpoint-у сервера. | 10 | max_open_connections |
setConnectionTTL(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает TTL соединения, по истечении которого соединение будет считаться неактивным | -1 | connection_ttl |
setKeepAliveTimeout(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает тайм-аут Keep-Alive для HTTP-соединения. Установите 0, чтобы отключить Keep-Alive. | - | http_keep_alive_timeout |
setConnectionReuseStrategy(ConnectionReuseStrategy strategy) | strategy - LIFO или FIFO | Выбирает стратегию повторного использования соединений, которую должен применять пул соединений | FIFO | connection_reuse_strategy |
setDefaultDatabase(String database) | database - имя базы данных | Устанавливает базу данных по умолчанию. | default | database |
| Метод | Аргументы | Описание | По умолчанию | Ключ |
|---|---|---|---|---|
setUsername(String username) | username - имя пользователя для аутентификации | Задает имя пользователя для метода аутентификации, который будет выбран последующей конфигурацией | default | user |
setPassword(String password) | password - секретное значение | Задает секрет для аутентификации по паролю и фактически выбирает этот метод аутентификации | - | password |
setAccessToken(String accessToken) | accessToken - строка access-токена | Задает access-токен для аутентификации и тем самым выбирает соответствующий метод аутентификации | - | access_token |
useSSLAuthentication(boolean useSSLAuthentication) | useSSLAuthentication - флаг для включения SSL-аутентификации | Устанавливает клиентский SSL-сертификат как метод аутентификации. | - | ssl_authentication |
useHTTPBasicAuth(boolean useBasicAuth) | useBasicAuth - флаг включения/отключения | Определяет, следует ли использовать базовую HTTP-аутентификацию для аутентификации по паре пользователь-пароль. Решает проблемы с паролями, содержащими спецсимволы. | true | http_use_basic_auth |
useBearerTokenAuth(String bearerToken) | bearerToken - закодированный bearer-токен | Определяет, следует ли использовать Bearer-аутентификацию и какой токен использовать. Токен будет отправлен как есть. | - | bearer_token |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setConnectTimeout(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает тайм-аут установления соединения для любого исходящего подключения. | - | connection_timeout |
setConnectionRequestTimeout(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает тайм-аут запроса соединения. Применяется только при получении соединения из пула. | 10000 | connection_request_timeout |
setSocketTimeout(long timeout, ChronoUnit unit) | timeout - значение тайм-аутаunit - единица времени | Устанавливает тайм-аут сокета, который влияет на операции чтения и записи. | 0 | socket_timeout |
setExecutionTimeout(long timeout, ChronoUnit timeUnit) | timeout - значение тайм-аутаtimeUnit - единица времени | Устанавливает максимальное время выполнения запросов | 0 | max_execution_time |
retryOnFailures(ClientFaultCause ...causes) | causes - константа перечисления ClientFaultCause | Задает типы ошибок, для которых будут выполняться повторные попытки. | NoHttpResponse ConnectTimeout ConnectionRequestTimeout | client_retry_on_failures |
setMaxRetries(int maxRetries) | maxRetries - количество повторных попыток | Устанавливает максимальное число повторных попыток для ошибок, определенных retryOnFailures. | 3 | retry |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setSocketRcvbuf(long size) | size - размер в байтах | Устанавливает размер буфера приёма TCP-сокета. Этот буфер располагается вне памяти JVM. | 8196 | socket_rcvbuf |
setSocketSndbuf(long size) | size - размер в байтах | Устанавливает размер буфера отправки TCP-сокета. Этот буфер располагается вне памяти JVM. | 8196 | socket_sndbuf |
setSocketKeepAlive(boolean value) | value - флаг для включения/выключения | Устанавливает опцию SO_KEEPALIVE для каждого TCP-сокета. TCP Keep-Alive включает механизм проверки работоспособности соединения. | - | socket_keepalive |
setSocketTcpNodelay(boolean value) | value - флаг для включения/выключения | Устанавливает опцию SO_NODELAY для каждого TCP-сокета. Эта опция TCP заставляет сокет отправлять данные как можно скорее. | - | socket_tcp_nodelay |
setSocketLinger(int secondsToWait) | secondsToWait - количество секунд | Устанавливает время задержки (linger) для каждого TCP-сокета, созданного клиентом. | - | socket_linger |
| Метод | Аргументы | Описание | Значение по умолчанию | Ключ |
|---|---|---|---|---|
compressServerResponse(boolean enabled) | enabled — флаг включения/выключения | Определяет, должен ли сервер сжимать свои ответы. | true | compress |
compressClientRequest(boolean enabled) | enabled — флаг включения/выключения | Определяет, должен ли клиент сжимать свои запросы. | false | decompress |
useHttpCompression(boolean enabled) | enabled — флаг включения/выключения | Определяет, следует ли использовать HTTP‑сжатие для взаимодействия клиент/сервер, если соответствующие параметры включены. | - | - |
appCompressedData(boolean enabled) | enabled — флаг включения/выключения | Сообщает клиенту, что сжатие будет обрабатываться приложением. | false | app_compressed_data |
setLZ4UncompressedBufferSize(int size) | size — размер в байтах | Устанавливает размер буфера, который будет получать несжатую часть потока данных. | 65536 | compression.lz4.uncompressed_buffer_size |
disableNativeCompression | disable — флаг отключения | Отключает нативное сжатие. Если установлено в true, нативное сжатие будет отключено. | false | disable_native_compression |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setSSLTrustStore(String path) | path - путь к файлу в локальной системе | Указывает, должен ли клиент использовать SSL truststore для проверки подлинности хоста сервера. | - | trust_store |
setSSLTrustStorePassword(String password) | password - секретное значение | Указывает пароль, который будет использоваться для разблокировки SSL truststore, указанного с помощью setSSLTrustStore. | - | key_store_password |
setSSLTrustStoreType(String type) | type - имя типа truststore | Указывает тип truststore, указанного с помощью setSSLTrustStore. | - | key_store_type |
setRootCertificate(String path) | path - путь к файлу в локальной системе | Указывает, должен ли клиент использовать указанный корневой (CA) сертификат для проверки подлинности хоста сервера. | - | sslrootcert |
setClientCertificate(String path) | path - путь к файлу в локальной системе | Указывает путь к клиентскому сертификату, который будет использоваться при установке SSL-соединения и для SSL-аутентификации. | - | sslcert |
setClientKey(String path) | path - путь к файлу в локальной системе | Указывает закрытый ключ клиента, который будет использоваться для шифрования SSL-взаимодействия с сервером. | - | ssl_key |
sslSocketSNI(String sni) | sni - строка с именем сервера | Указывает имя сервера, которое будет использоваться для SNI (Server Name Indication) в SSL/TLS-соединении. | - | ssl_socket_sni |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
addProxy(ProxyType type, String host, int port) | type - тип проксиhost - имя хоста или IP-адрес прокси-сервераport - порт прокси-сервера | Устанавливает прокси-сервер, который будет использоваться для взаимодействия с сервером. | - | proxy_type, proxy_host, proxy_port |
setProxyCredentials(String user, String pass) | user - имя пользователя проксиpass - пароль | Задает учетные данные для аутентификации на прокси-сервере. | - | proxy_user, proxy_password |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setHttpCookiesEnabled(boolean enabled) | enabled - флаг включения/отключения | Определяет, должны ли HTTP‑cookie сохраняться и отправляться обратно на сервер. | - | - |
httpHeader(String key, String value) | key - ключ HTTP‑заголовкаvalue - строковое значение | Устанавливает значение для одного HTTP‑заголовка. Предыдущее значение перезаписывается. | none | none |
httpHeader(String key, Collection values) | key - ключ HTTP‑заголовкаvalues - список строковых значений | Устанавливает значения для одного HTTP‑заголовка. Предыдущее значение перезаписывается. | none | none |
httpHeaders(Map headers) | headers - map с HTTP‑заголовками | Устанавливает несколько HTTP‑заголовков одновременно. | none | none |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
serverSetting(String name, String value) | name - имя настройкиvalue - значение настройки | Указывает, какие настройки передавать серверу вместе с каждым запросом. Настройки отдельных операций могут их переопределять. Список настроек | none | none |
serverSetting(String name, Collection values) | name - имя настройкиvalues - значения настройки | Указывает, какие настройки с множественными значениями передавать серверу, например роли | none | none |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
useServerTimeZone(boolean useServerTimeZone) | useServerTimeZone - флаг включения/выключения | Определяет, должен ли клиент использовать часовой пояс сервера при декодировании значений столбцов DateTime и Date. | true | use_server_time_zone |
useTimeZone(String timeZone) | timeZone - допустимый в Java идентификатор часового пояса | Определяет, должен ли использоваться указанный часовой пояс при декодировании значений столбцов DateTime и Date. Переопределяет часовой пояс сервера. | - | use_time_zone |
setServerTimeZone(String timeZone) | timeZone - допустимый в Java идентификатор часового пояса | Задает часовой пояс на стороне сервера. По умолчанию используется часовой пояс UTC. | UTC | server_time_zone |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setOption(String key, String value) | key - ключ параметра конфигурацииvalue - значение параметра | Устанавливает сырое значение параметров клиента. Полезно при чтении конфигурации из property-файлов. | - | - |
useAsyncRequests(boolean async) | async - флаг включения/выключения | Определяет, должен ли клиент выполнять запросы в отдельном потоке. По умолчанию отключено, так как приложение лучше знает, как организовать многопоточные задачи. | false | async |
setSharedOperationExecutor(ExecutorService executorService) | executorService - экземпляр ExecutorService | Задает ExecutorService для выполнения операционных задач. | none | none |
setClientNetworkBufferSize(int size) | size - размер в байтах | Устанавливает размер буфера в адресном пространстве памяти приложения, который используется для копирования данных между сокетом и приложением. | 300000 | client_network_buffer_size |
allowBinaryReaderToReuseBuffers(boolean reuse) | reuse - флаг включения/выключения | Если включено, двоичный читатель будет использовать заранее выделенные буферы для транскодирования чисел. Снижает нагрузку на GC для числовых данных. | - | - |
columnToMethodMatchingStrategy(ColumnToMethodMatchingStrategy strategy) | strategy - реализация стратегии сопоставления | Задает пользовательскую стратегию, используемую для сопоставления полей класса DTO и столбцов БД при регистрации DTO. | none | none |
setClientName(String clientName) | clientName - строка с именем приложения | Устанавливает дополнительную информацию о вызывающем приложении. Будет передана в заголовке User-Agent. | - | client_name |
registerClientMetrics(Object registry, String name) | registry - экземпляр реестра Micrometername - имя группы метрик | Регистрирует метрики в экземпляре реестра Micrometer (https://micrometer.io/). | - | - |
setServerVersion(String version) | version - строка с версией сервера | Устанавливает версию сервера, чтобы избежать автоматического определения версии. | - | server_version |
typeHintMapping(Map typeHintMapping) | typeHintMapping - отображение (Map) подсказок типов | Устанавливает отображение подсказок типов для типов ClickHouse. Например, чтобы многомерные массивы представлялись в виде контейнеров Java. | - | type_hint_mapping |
Настройки сервера
Настройки на стороне сервера можно задать на уровне клиента однократно при создании (см. метод serverSetting класса Builder) и на уровне операции (см. serverSetting для класса настроек операции).
⚠️ При установке параметров через метод setOption (в Client.Builder или в классе настроек операции) имя настройки сервера должно начинаться с префикса clickhouse_setting_. В этом случае может быть полезен com.clickhouse.client.api.ClientConfigProperties#serverSetting().
Пользовательский HTTP-заголовок
Пользовательские HTTP-заголовки можно задать для всех операций (на уровне клиента) или только для одной (на уровне операции).
Когда параметры задаются через метод setOption (в Client.Builder или в классе настроек операции), имя пользовательского заголовка должно начинаться с префикса http_header_. Для этого может быть полезен метод com.clickhouse.client.api.ClientConfigProperties#httpHeader().
Общие определения
ClickHouseFormat
Перечисление поддерживаемых форматов. Оно включает все форматы, поддерживаемые ClickHouse.
raw— пользователь должен сам выполнять транскодирование сырых данныхfull- клиент может самостоятельно выполнять транскодирование данных и принимать необработанный поток данных-- операция не поддерживается ClickHouse для этого формата
Эта версия клиента поддерживает:
API вставки
insert(String tableName, InputStream data, ClickHouseFormat format)
Принимает данные в виде потока байтов InputStream в указанном формате. Ожидается, что data закодированы в формате format.
Подписи
Параметры
tableName — имя целевой таблицы.
data — входной поток кодированных данных.
format — формат, в котором закодированы данные.
settings — настройки запроса.
Возвращаемое значение
Future типа InsertResponse — результат операции и дополнительная информация, например, метрики на стороне сервера.
Примеры
insert(String tableName, List<?> data, InsertSettings settings)
Отправляет запрос на запись в базу данных. Список объектов преобразуется в эффективный формат и затем отправляется на сервер. Класс элементов списка должен быть предварительно зарегистрирован с помощью метода register(Class, TableSchema).
Сигнатуры
Параметры
tableName — имя целевой таблицы.
data — коллекция объектов DTO (Data Transfer Object).
settings — настройки запроса.
Возвращаемое значение
Future типа InsertResponse — результат операции и дополнительная информация, например, метрики на стороне сервера.
Примеры
InsertSettings
Параметры конфигурации операций вставки.
Методы конфигурации
| Метод | Описание |
|---|---|
setQueryId(String queryId) | Устанавливает идентификатор запроса, который будет присвоен операции. Значение по умолчанию: null. |
setDeduplicationToken(String token) | Устанавливает токен дедупликации. Этот токен будет отправлен на сервер и может использоваться для идентификации запроса. Значение по умолчанию: null. |
setInputStreamCopyBufferSize(int size) | Размер буфера копирования. Буфер используется во время операций записи для копирования данных из входного потока, предоставленного пользователем, в выходной поток. По умолчанию: 8196. |
serverSetting(String name, String value) | Задаёт отдельную настройку сервера для операции. |
serverSetting(String name, Collection values) | Устанавливает отдельную серверную настройку с несколькими значениями для операции. Элементы коллекции должны быть значениями типа String. |
setDBRoles(Collection dbRoles) | Задаёт роли БД, которые должны быть установлены перед выполнением операции. Элементы коллекции должны быть значениями типа String. |
setOption(String option, Object value) | Задаёт параметр конфигурации в «сыром» виде. Это не серверная настройка. |
InsertResponse
Объект ответа, содержащий результат операции вставки. Он доступен только в том случае, если клиент получил ответ от сервера.
Этот объект необходимо закрыть как можно скорее для освобождения соединения, так как соединение не может быть использовано повторно до полного чтения всех данных предыдущего ответа.
| Метод | Описание |
|---|---|
OperationMetrics getMetrics() | Возвращает объект с метриками операции. |
String getQueryId() | Возвращает идентификатор запроса, назначенный для операции приложением (через параметры операции) или сервером. |
API запросов
query(String sqlQuery)
Отправляет sqlQuery как есть. Формат ответа задается настройками запроса. QueryResponse будет содержать ссылку на поток ответа, который должен быть обработан читателем для соответствующего формата.
Подписи
Параметры
sqlQuery — один SQL-оператор. Запрос отправляется на сервер в исходном виде.
settings — настройки запроса.
Возвращаемое значение
Future типа QueryResponse — результирующий набор данных и дополнительная информация, такая как метрики на стороне сервера. Объект Response должен быть закрыт после чтения набора данных.
Примеры
query(String sqlQuery, Map<String, Object> queryParams, QuerySettings settings)
Отправляет sqlQuery как есть. Также отправляет параметры запроса, чтобы сервер мог скомпилировать SQL-выражение.
Подписи
Параметры
sqlQuery - SQL-выражение с плейсхолдерами {}.
queryParams - словарь переменных для подстановки в SQL-выражение на сервере.
settings — настройки запроса.
Возвращаемое значение
Future типа QueryResponse — результирующий набор данных и дополнительная информация, такая как метрики на стороне сервера. Объект Response должен быть закрыт после чтения набора данных.
Примеры
queryAll(String sqlQuery)
Запрашивает данные в формате RowBinaryWithNamesAndTypes. Возвращает результат в виде коллекции. Производительность чтения такая же, как при использовании reader, но требуется больше памяти для хранения всего набора данных.
Подписи
Параметры
sqlQuery — SQL-выражение для выборки данных с сервера.
Возвращаемое значение
Полный набор данных, представленный списком объектов GenericRecord, которые обеспечивают построчный доступ к результирующим данным.
Примеры
QuerySettings
Параметры конфигурации для операций с запросами.
Методы конфигурации
| Метод | Описание |
|---|---|
setQueryId(String queryId) | Задаёт идентификатор запроса, который будет присвоен операции. |
setFormat(ClickHouseFormat format) | Задаёт формат ответа. Полный список см. в RowBinaryWithNamesAndTypes. |
setMaxExecutionTime(Integer maxExecutionTime) | Устанавливает время выполнения операции на сервере. Не влияет на таймаут чтения. |
waitEndOfQuery(Boolean waitEndOfQuery) | Указывает серверу дождаться завершения запроса перед отправкой ответа. |
setUseServerTimeZone(Boolean useServerTimeZone) | Часовой пояс сервера (см. конфигурацию клиента) будет использоваться для разбора типов даты и времени в результатах операции. По умолчанию false. |
setUseTimeZone(String timeZone) | Запрашивает использование сервером часового пояса timeZone при преобразовании времени. См. session_timezone. |
serverSetting(String name, String value) | Задаёт отдельную настройку сервера для операции. |
serverSetting(String name, Collection values) | Устанавливает отдельные серверные настройки с несколькими значениями для операции. Элементы коллекции должны иметь тип String. |
setDBRoles(Collection dbRoles) | Указывает роли БД, которые нужно назначить перед выполнением операции. Элементы коллекции должны быть значениями типа String. |
setOption(String option, Object value) | Устанавливает параметр конфигурации в необработанном виде. Это не параметр сервера. |
QueryResponse
Объект ответа, содержащий результат выполнения запроса. Доступен только при получении ответа от сервера.
Этот объект необходимо закрыть как можно скорее для освобождения соединения, так как соединение не может быть использовано повторно до полного чтения всех данных предыдущего ответа.
| Метод | Описание |
|---|---|
ClickHouseFormat getFormat() | Возвращает формат, в котором закодированы данные в ответе. |
InputStream getInputStream() | Возвращает поток несжатых байтов данных в указанном формате. |
OperationMetrics getMetrics() | Возвращает объект с метриками операции. |
String getQueryId() | Возвращает идентификатор запроса, назначенный операции приложением (через настройки операции) или сервером. |
TimeZone getTimeZone() | Возвращает часовой пояс, который должен использоваться при обработке типов Date/DateTime в ответе. |
Примеры
- Примеры кода доступны в репозитории
- См. реализацию Spring‑сервиса: implementation
Общий API
getTableSchema(String table)
Получает схему таблицы для table.
Подписи
Параметры
table — имя таблицы, для которой требуется получить данные схемы.
database — база данных, в которой определена целевая таблица.
Возвращаемое значение
Возвращает объект TableSchema со списком столбцов таблицы.
getTableSchemaFromQuery(String sql)
Извлекает схему из SQL-запроса.
Сигнатуры
Параметры
sql - SQL-оператор "SELECT", для которого должна быть возвращена схема.
Возвращаемое значение
Возвращает объект TableSchema со столбцами, соответствующими SQL-выражению sql.
TableSchema
register(Class<?> clazz, TableSchema schema)
Компилирует слой сериализации и десериализации для Java-класса, используемого для записи и чтения данных с помощью schema. Метод создаёт сериализатор и десериализатор для пары getter/setter и соответствующего столбца.
Соответствие столбца находится путём извлечения его имени из имени метода. Например, getFirstName будет соответствовать столбцу first_name или firstname.
Подписи
Параметры
clazz - Класс, представляющий POJO, используемый для чтения и записи данных.
schema - Схема данных для сопоставления со свойствами POJO.
Примеры
Примеры использования
Полные примеры кода хранятся в репозитории в папке example:
- client-v2 - основной набор примеров.
- demo-service - пример использования клиента в приложении Spring Boot.
- demo-kotlin-service - пример того, как использовать клиент в приложении Ktor на Kotlin.
Руководство по миграции
Старый клиент (V1) использовал com.clickhouse.client.ClickHouseClient#builder в качестве отправной точки. Новый клиент (V2) использует аналогичный паттерн с com.clickhouse.client.api.Client.Builder. Основные
отличия:
- загрузчик сервисов (service loader) не используется для получения реализации. Класс
com.clickhouse.client.api.Clientявляется фасадным классом для всех возможных реализаций в будущем. - меньше источников конфигурации: один передаётся билдеру, другой задаётся настройками операций (
QuerySettings,InsertSettings). В предыдущей версии конфигурация задавалась на уровне каждого узла и в некоторых случаях загружалась из переменных окружения.
Соответствие параметров конфигурации
В V1 имеется 3 класса перечислений, связанных с конфигурацией:
com.clickhouse.client.config.ClickHouseDefaults— параметры конфигурации, которые предполагается задавать в большинстве сценариев использования. Например,USERиPASSWORD.com.clickhouse.client.config.ClickHouseClientOption— параметры конфигурации клиента, напримерHEALTH_CHECK_INTERVAL.com.clickhouse.client.http.config.ClickHouseHttpOption— конфигурационные параметры, специфичные для HTTP-интерфейса. Например,RECEIVE_QUERY_PROGRESS.
Они были разработаны для группировки параметров и обеспечения четкого разделения. Однако в некоторых случаях это приводило к путанице (есть ли разница между com.clickhouse.client.config.ClickHouseDefaults#ASYNC и
com.clickhouse.client.config.ClickHouseClientOption#ASYNC). Новый клиент V2 использует com.clickhouse.client.api.Client.Builder в качестве единого словаря всех возможных параметров конфигурации клиента. Существует
com.clickhouse.client.api.ClientConfigProperties, где перечислены все имена параметров конфигурации.
В таблице ниже показано, какие старые параметры поддерживаются в новом клиенте и каково их новое значение.
Условные обозначения: ✔ = поддерживается, ✗ = не поддерживается
- Подключение и аутентификация
- SSL и безопасность
- Параметры сокетов
- Сжатие
- Прокси
- Тайм-ауты и повторные попытки
- Часовой пояс
- Буферы и производительность
- Многопоточность и асинхронность
- HTTP и заголовки
- Формат и запрос
- Обнаружение узлов и балансировка нагрузки
- Прочее
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#HOST | Client.Builder#addEndpoint | |
ClickHouseDefaults#PROTOCOL | ✗ | В V2 поддерживается только HTTP |
ClickHouseDefaults#DATABASEClickHouseClientOption#DATABASE | Client.Builder#setDefaultDatabase | |
ClickHouseDefaults#USER | Client.Builder#setUsername | |
ClickHouseDefaults#PASSWORD | Client.Builder#setPassword | |
ClickHouseClientOption#CONNECTION_TIMEOUT | Client.Builder#setConnectTimeout | |
ClickHouseClientOption#CONNECTION_TTL | Client.Builder#setConnectionTTL | |
ClickHouseHttpOption#MAX_OPEN_CONNECTIONS | Client.Builder#setMaxConnections | |
ClickHouseHttpOption#KEEP_ALIVEClickHouseHttpOption#KEEP_ALIVE_TIMEOUT | Client.Builder#setKeepAliveTimeout | |
ClickHouseHttpOption#CONNECTION_REUSE_STRATEGY | Client.Builder#setConnectionReuseStrategy | |
ClickHouseHttpOption#USE_BASIC_AUTHENTICATION | Client.Builder#useHTTPBasicAuth |
| Конфигурация V1 | Метод Builder V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#SSL_CERTIFICATE_TYPE | ✗ | |
ClickHouseDefaults#SSL_KEY_ALGORITHM | ✗ | |
ClickHouseDefaults#SSL_PROTOCOL | ✗ | |
ClickHouseClientOption#SSL | ✗ | См. Client.Builder#addEndpoint |
ClickHouseClientOption#SSL_MODE | ✗ | |
ClickHouseClientOption#SSL_ROOT_CERTIFICATE | Client.Builder#setRootCertificate | Аутентификация SSL должна быть включена с помощью useSSLAuthentication |
ClickHouseClientOption#SSL_CERTIFICATE | Client.Builder#setClientCertificate | |
ClickHouseClientOption#SSL_KEY | Client.Builder#setClientKey | |
ClickHouseClientOption#KEY_STORE_TYPE | Client.Builder#setSSLTrustStoreType | |
ClickHouseClientOption#TRUST_STORE | Client.Builder#setSSLTrustStore | |
ClickHouseClientOption#KEY_STORE_PASSWORD | Client.Builder#setSSLTrustStorePassword | |
ClickHouseClientOption#SSL_SOCKET_SNI | Client.Builder#sslSocketSNI | |
ClickHouseClientOption#CUSTOM_SOCKET_FACTORY | ✗ | |
ClickHouseClientOption#CUSTOM_SOCKET_FACTORY_OPTIONS | ✗ | См. Client.Builder#sslSocketSNI для настройки SNI |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#SOCKET_TIMEOUT | Client.Builder#setSocketTimeout | |
ClickHouseClientOption#SOCKET_REUSEADDR | Client.Builder#setSocketReuseAddress | |
ClickHouseClientOption#SOCKET_KEEPALIVE | Client.Builder#setSocketKeepAlive | |
ClickHouseClientOption#SOCKET_LINGER | Client.Builder#setSocketLinger | |
ClickHouseClientOption#SOCKET_IP_TOS | ✗ | |
ClickHouseClientOption#SOCKET_TCP_NODELAY | Client.Builder#setSocketTcpNodelay | |
ClickHouseClientOption#SOCKET_RCVBUF | Client.Builder#setSocketRcvbuf | |
ClickHouseClientOption#SOCKET_SNDBUF | Client.Builder#setSocketSndbuf |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#COMPRESS | Client.Builder#compressServerResponse | См. также useHttpCompression |
ClickHouseClientOption#DECOMPRESS | Client.Builder#compressClientRequest | См. также useHttpCompression |
ClickHouseClientOption#COMPRESS_ALGORITHM | ✗ | LZ4 для не-HTTP-протокола. HTTP использует Accept-Encoding |
ClickHouseClientOption#DECOMPRESS_ALGORITHM | ✗ | LZ4 для не-HTTP-протокола. HTTP использует Content-Encoding |
ClickHouseClientOption#COMPRESS_LEVEL | ✗ | |
ClickHouseClientOption#DECOMPRESS_LEVEL | ✗ |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#PROXY_TYPE | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_HOST | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_PORT | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_USERNAME | Client.Builder#setProxyCredentials | |
ClickHouseClientOption#PROXY_PASSWORD | Client.Builder#setProxyCredentials |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#MAX_EXECUTION_TIME | Client.Builder#setExecutionTimeout | |
ClickHouseClientOption#RETRY | Client.Builder#setMaxRetries | См. также retryOnFailures |
ClickHouseHttpOption#AHC_RETRY_ON_FAILURE | Client.Builder#retryOnFailures | |
ClickHouseClientOption#FAILOVER | ✗ | |
ClickHouseClientOption#REPEAT_ON_SESSION_LOCK | ✗ | |
ClickHouseClientOption#SESSION_ID | ✗ | |
ClickHouseClientOption#SESSION_CHECK | ✗ | |
ClickHouseClientOption#SESSION_TIMEOUT | ✗ |
| Конфигурация в V1 | Метод Builder в V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#SERVER_TIME_ZONEClickHouseClientOption#SERVER_TIME_ZONE | Client.Builder#setServerTimeZone | |
ClickHouseClientOption#USE_SERVER_TIME_ZONE | Client.Builder#useServerTimeZone | |
ClickHouseClientOption#USE_SERVER_TIME_ZONE_FOR_DATES | ||
ClickHouseClientOption#USE_TIME_ZONE | Client.Builder#useTimeZone |
| Параметр V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#BUFFER_SIZE | Client.Builder#setClientNetworkBufferSize | |
ClickHouseClientOption#BUFFER_QUEUE_VARIATION | ✗ | |
ClickHouseClientOption#READ_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#WRITE_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#REQUEST_CHUNK_SIZE | ✗ | |
ClickHouseClientOption#REQUEST_BUFFERING | ✗ | |
ClickHouseClientOption#RESPONSE_BUFFERING | ✗ | |
ClickHouseClientOption#MAX_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#MAX_QUEUED_BUFFERS | ✗ | |
ClickHouseClientOption#MAX_QUEUED_REQUESTS | ✗ | |
ClickHouseClientOption#REUSE_VALUE_WRAPPER | ✗ |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#ASYNCClickHouseClientOption#ASYNC | Client.Builder#useAsyncRequests | |
ClickHouseDefaults#MAX_SCHEDULER_THREADS | ✗ | см. setSharedOperationExecutor |
ClickHouseDefaults#MAX_THREADS | ✗ | см. setSharedOperationExecutor |
ClickHouseDefaults#THREAD_KEEPALIVE_TIMEOUT | см. setSharedOperationExecutor | |
ClickHouseClientOption#MAX_THREADS_PER_CLIENT | ✗ | |
ClickHouseClientOption#MAX_CORE_THREAD_TTL | ✗ |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseHttpOption#CUSTOM_HEADERS | Client.Builder#httpHeaders | |
ClickHouseHttpOption#CUSTOM_PARAMS | ✗ | См. Client.Builder#serverSetting |
ClickHouseClientOption#CLIENT_NAME | Client.Builder#setClientName | |
ClickHouseHttpOption#CONNECTION_PROVIDER | ✗ | |
ClickHouseHttpOption#DEFAULT_RESPONSE | ✗ | |
ClickHouseHttpOption#SEND_HTTP_CLIENT_ID | ✗ | |
ClickHouseHttpOption#AHC_VALIDATE_AFTER_INACTIVITY | ✗ | Всегда включено при использовании Apache Http Client |
| Конфигурация V1 | Метод построителя V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#FORMATClickHouseClientOption#FORMAT | ✗ | Перемещено в настройки операций (QuerySettings и InsertSettings) |
ClickHouseClientOption#QUERY_ID | ✗ | См. QuerySettings и InsertSettings |
ClickHouseClientOption#LOG_LEADING_COMMENT | ✗ | См. QuerySettings#logComment и InsertSettings#logComment |
ClickHouseClientOption#MAX_RESULT_ROWS | ✗ | Это серверная настройка |
ClickHouseClientOption#RESULT_OVERFLOW_MODE | ✗ | Это серверная настройка |
ClickHouseHttpOption#RECEIVE_QUERY_PROGRESS | ✗ | Серверная настройка |
ClickHouseHttpOption#WAIT_END_OF_QUERY | ✗ | Серверная настройка |
ClickHouseHttpOption#REMEMBER_LAST_SET_ROLES | Client#setDBRoles | Теперь настраивается во время выполнения. См. также QuerySettings#setDBRoles и InsertSettings#setDBRoles |
| Конфигурация V1 | Метод билдера V2 | Комментарии |
|---|---|---|
ClickHouseClientOption#AUTO_DISCOVERY | ✗ | |
ClickHouseClientOption#LOAD_BALANCING_POLICY | ✗ | |
ClickHouseClientOption#LOAD_BALANCING_TAGS | ✗ | |
ClickHouseClientOption#HEALTH_CHECK_INTERVAL | ✗ | |
ClickHouseClientOption#HEALTH_CHECK_METHOD | ✗ | |
ClickHouseClientOption#NODE_DISCOVERY_INTERVAL | ✗ | |
ClickHouseClientOption#NODE_DISCOVERY_LIMIT | ✗ | |
ClickHouseClientOption#NODE_CHECK_INTERVAL | ✗ | |
ClickHouseClientOption#NODE_GROUP_SIZE | ✗ | |
ClickHouseClientOption#CHECK_ALL_NODES | ✗ |
| Конфигурация V1 | Метод построителя V2 | Комментарии |
|---|---|---|
ClickHouseDefaults#AUTO_SESSION | ✗ | Поддержка сессий будет пересмотрена |
ClickHouseDefaults#BUFFERING | ✗ | |
ClickHouseDefaults#MAX_REQUESTS | ✗ | |
ClickHouseDefaults#ROUNDING_MODE | ||
ClickHouseDefaults#SERVER_VERSIONClickHouseClientOption#SERVER_VERSION | Client.Builder#setServerVersion | |
ClickHouseDefaults#SRV_RESOLVE | ✗ | |
ClickHouseClientOption#CUSTOM_SETTINGS | ||
ClickHouseClientOption#PRODUCT_NAME | ✗ | Использовать имя клиента |
ClickHouseClientOption#RENAME_RESPONSE_COLUMN | ✗ | |
ClickHouseClientOption#SERVER_REVISION | ✗ | |
ClickHouseClientOption#TRANSACTION_TIMEOUT | ✗ | |
ClickHouseClientOption#WIDEN_UNSIGNED_TYPES | ✗ | |
ClickHouseClientOption#USE_BINARY_STRING | ✗ | |
ClickHouseClientOption#USE_BLOCKING_QUEUE | ✗ | |
ClickHouseClientOption#USE_COMPILATION | ✗ | |
ClickHouseClientOption#USE_OBJECTS_IN_ARRAYS | ✗ | |
ClickHouseClientOption#MAX_MAPPER_CACHE | ✗ | |
ClickHouseClientOption#MEASURE_REQUEST_TIME | ✗ |
Общие отличия
- Клиент V2 использует меньше проприетарных классов, что повышает переносимость. Например, V2 работает с любой реализацией
java.io.InputStreamдля записи данных на сервер. - В Client V2 параметр
asyncпо умолчанию отключен (off). Это означает отсутствие дополнительных потоков и больший контроль приложения над клиентом. В большинстве случаев этот параметр должен оставатьсяoff. Включениеasyncсоздаст отдельный поток для запроса. Это имеет смысл только при использовании управляемого приложением executor-а (см.com.clickhouse.client.api.Client.Builder#setSharedOperationExecutor)
Запись данных
- используйте любую реализацию интерфейса
java.io.InputStream. V1com.clickhouse.data.ClickHouseInputStreamподдерживается, но НЕ рекомендуется к использованию. - Как только обнаруживается конец входного потока, он обрабатывается соответствующим образом. Ранее выходной поток запроса приходилось закрывать вручную.
V1 Вставка данных в формате TSV.
V2 Вставка данных в формате TSV.
- достаточно вызвать один метод — нет необходимости создавать дополнительный объект запроса.
- Поток тела запроса автоматически закрывается, как только все данные будут скопированы.
- Теперь доступен новый низкоуровневый API
com.clickhouse.client.api.Client#insert(java.lang.String, java.util.List<java.lang.String>, com.clickhouse.client.api.DataStreamWriter, com.clickhouse.data.ClickHouseFormat, com.clickhouse.client.api.insert.InsertSettings).com.clickhouse.client.api.DataStreamWriterпредназначен для реализации пользовательской логики записи данных, например, для чтения данных из очереди.
Чтение данных
- По умолчанию данные читаются в формате
RowBinaryWithNamesAndTypes. В настоящее время при необходимости привязки данных поддерживается только этот формат. - Данные можно считывать как коллекцию записей с помощью метода
List<GenericRecord> com.clickhouse.client.api.Client#queryAll(java.lang.String). Он загружает данные в память и освобождает соединение, поэтому дополнительная обработка не требуется.GenericRecordпредоставляет доступ к данным и выполняет некоторые преобразования.