Java Клиент (0.8+)
Java библиотека клиента для взаимодействия с сервером БД через его протоколы. Текущая реализация поддерживает только HTTP интерфейс. Библиотека предоставляет собственное API для отправки запросов на сервер. Она также предоставляет инструменты для работы с различными бинарными форматами данных (RowBinary* & Native*).
Если вы ищете более раннюю версию документации клиента java, пожалуйста, смотрите здесь.
Установка
- Maven Central (страница проекта): https://mvnrepository.com/artifact/com.clickhouse/client-v2
- Ночные сборки (ссылка на репозиторий): https://s01.oss.sonatype.org/content/repositories/snapshots/com/clickhouse/
- 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
.
Конфигурация клиента
Метод конфигурации | Аргументы | Описание |
---|---|---|
addEndpoint(String endpoint) | - endpoint - URL, отформатированный как адрес сервера. | Добавляет конечную точку сервера в список доступных серверов. В настоящее время поддерживается только одна конечная точка. |
addEndpoint(Protocol protocol, String host, int port, boolean secure) | - protocol - протокол соединения com.clickhouse.client.api.enums.Protocol#HTTP .- host - IP или имя хоста сервера.- secure - если общение должно использовать защищенную версию протокола (HTTPS) | Добавляет конечную точку сервера в список доступных серверов. В настоящее время поддерживается только одна конечная точка. |
setOption(String key, String value) | - key - строковый ключ опции конфигурации клиента.- value - строковое значение опции | Устанавливает сырое значение опций клиента. Полезно, когда чтение конфигурации происходит из файлов свойств. |
setUsername(String username) | - username - имя пользователя для использования при аутентификации | Устанавливает имя пользователя для метода аутентификации, выбранного дальнейшей конфигурацией |
setPassword(String password) | - password - секретное значение для аутентификации по паролю | Устанавливает секрет для аутентификации по паролю и фактически выбирает как метод аутентификации |
setAccessToken(String accessToken) | - accessToken - строковое представление токена доступа | Устанавливает токен доступа для аутентификации с установленным соответствующим методом аутентификации |
useSSLAuthentication(boolean useSSLAuthentication) | - useSSLAuthentication - флаг, указывающий, использовать ли SSL аутентификацию | Устанавливает клиентский сертификат SSL как метод аутентификации |
enableConnectionPool(boolean enable) | - enable - флаг, указывающий, следует ли включить опцию | Устанавливает, включен ли пул соединений |
setConnectTimeout(long timeout, ChronoUnit unit) | - timeout - тайм-аут в одной из единиц времени.- unit - единица времени тайм-аута | Устанавливает тайм-аут инициирования соединения для любого исходящего соединения. Это влияет на время ожидания при получении подключения сокета. |
setConnectionRequestTimeout(long timeout, ChronoUnit unit) | - timeout - тайм-аут в одной из единиц времени.- unit - единица времени тайм-аута | Устанавливает тайм-аут запроса соединения. Это влияет только на получение соединения из пула. |
setMaxConnections(int maxConnections) | - maxConnections - количество подключений | Устанавливает, сколько подключений клиент может открыть к каждой конечной точке сервера. |
setConnectionTTL(long timeout, ChronoUnit unit) | - timeout - тайм-аут в одной из единиц времени.- unit - единица времени тайм-аута | Устанавливает TTL подключения, после которого подключение будет считаться неактивным |
setKeepAliveTimeout(long timeout, ChronoUnit unit) | - timeout - тайм-аут в одной из единиц времени.- unit - единица времени тайм-аута | Устанавливает тайм-аут keep-alive для HTTP соединения. Эта опция может быть использована для отключения Keep-Alive, установив тайм-аут на ноль - 0 |
setConnectionReuseStrategy(ConnectionReuseStrategy strategy) | - strategy - константа com.clickhouse.client.api.ConnectionReuseStrategy | Выбирает, какая стратегия должна использоваться в пуле соединений: LIFO , если соединение должно быть повторно использовано, как только оно возвращается в пул, или FIFO , чтобы использовать соединение в порядке его поступления (возвращенные соединения не используются немедленно). |
setSocketTimeout(long timeout, ChronoUnit unit) | - timeout - тайм-аут в одной из единиц времени.- unit - единица времени тайм-аута | Устанавливает тайм-аут для сокета, который влияет на операции чтения и записи |
setSocketRcvbuf(long size) | - size - размер в байтах | Устанавливает буфер приема TCP-сокета. Этот буфер вне памяти JVM. |
setSocketSndbuf(long size) | - size - размер в байтах | Устанавливает буфер отправки TCP-сокета. Этот буфер вне памяти JVM. |
setSocketKeepAlive(boolean value) | - value - флаг, который указывает, следует ли включить опцию. | Устанавливает опцию SO_KEEPALIVE для каждого TCP-сокета, созданного клиентом. TCP Keep Alive включает механизм, который проверяет работоспособность соединения и помогает обнаружить резко завершенные соединения. |
setSocketTcpNodelay(boolean value) | - value - флаг, который указывает, следует ли включить опцию. | Устанавливает опцию SO_NODELAY для каждого TCP-сокета, созданного клиентом. Эта опция TCP заставит сокет отправлять данные как можно скорее. |
setSocketLinger(int secondsToWait) | - secondsToWait - количество секунд. | Устанавливает время ожидания для каждого TCP-сокета, созданного клиентом. |
compressServerResponse(boolean enabled) | - enabled - флаг, который указывает, следует ли включить опцию | Устанавливает, должен ли сервер сжимать свои ответы. |
compressClientRequest(boolean enabled) | - enabled - флаг, который указывает, следует ли включить опцию | Устанавливает, должен ли клиент сжимать свои запросы. |
useHttpCompression(boolean enabled) | - enabled - флаг, который указывает, следует ли включить опцию | Устанавливает, должен ли использоваться HTTP сжатие для общения клиент/сервер, если соответствующие опции включены |
setLZ4UncompressedBufferSize(int size) | - size - размер в байтах | Устанавливает размер буфера, который будет получать несжатую часть потока данных. Если размер буфера окажется недостаточным - будет создан новый, и соответствующее предупреждение появится в логах. |
setDefaultDatabase(String database) | - database - название базы данных | Устанавливает базу данных по умолчанию. |
addProxy(ProxyType type, String host, int port) | - type - тип прокси.- host - имя хоста прокси или IP-адрес.- port - порт прокси | Устанавливает прокси, который будет использоваться для общения с сервером. Настройка прокси обязательна, если прокси требует аутентификации. |
setProxyCredentials(String user, String pass) | - user - имя пользователя прокси.- pass - пароль | Устанавливает учетные данные пользователя для аутентификации с прокси. |
setExecutionTimeout(long timeout, ChronoUnit timeUnit) | - timeout - тайм-аут в одной из единиц времени.- timeUnit - единица времени тайм-аута | Устанавливает максимальный тайм-аут выполнения для запросов |
setHttpCookiesEnabled(boolean enabled) | enabled - флаг, указывающий, следует ли включить опцию | Устанавливает, должны ли HTTP cookies запоминаться и отправляться обратно на сервер. |
setSSLTrustStore(String path) | path - путь к файлу на локальной системе (на стороне клиента) | Устанавливает, должен ли клиент использовать хранилище SSL для проверки владельца сервера. |
setSSLTrustStorePassword(String password) | password - секретное значение | Устанавливает пароль, который будет использоваться для разблокировки хранилища SSL, указанного в setSSLTrustStore(String path) |
setSSLTrustStoreType(String type) | type - имя типа хранилища | Устанавливает тип хранилища, указанный в setSSLTrustStore(String path) . |
setRootCertificate(String path) | path - путь к файлу на локальной системе (на стороне клиента) | Устанавливает, должен ли клиент использовать указанный корневой (CA) сертификат для проверки владельца сервера. |
setClientCertificate(String path) | path - путь к файлу на локальной системе (на стороне клиента) | Устанавливает путь к клиентскому сертификату, который будет использоваться при инициировании SSL соединения и для SSL аутентификации |
setClientKey(String path) | path - путь к файлу на локальной системе (на стороне клиента) | Устанавливает личный ключ клиента, который будет использоваться для шифрования SSL связи с сервером. |
useServerTimeZone(boolean useServerTimeZone) | useServerTimeZone - флаг, указывающий, следует ли включить опцию | Устанавливает, должен ли клиент использовать часовой пояс сервера при декодировании значений столбцов DateTime и Date. Если включено, то часовой пояс сервера должен быть установлен с помощью setServerTimeZone(String timeZone) |
useTimeZone(String timeZone) | timeZone - строковое значение ID часового пояса, действительного для java (см. java.time.ZoneId ) | Устанавливает, должен ли использоваться указанный часовой пояс при декодировании значений столбцов DateTime и Date. Это переопределит часовой пояс сервера |
setServerTimeZone(String timeZone) | timeZone - строковое значение ID часового пояса, действительного для java (см. java.time.ZoneId ) | Устанавливает часовой пояс на стороне сервера. По умолчанию будет использоваться часовой пояс UTC. |
useAsyncRequests(boolean async) | async - флаг, указывающий, следует ли включить опцию. | Устанавливает, должен ли клиент выполнять запрос в отдельном потоке. По умолчанию отключено, потому что приложение лучше знает, как организовать многопоточные задачи, и выполнение задач в отдельном потоке не помогает с производительностью. |
setSharedOperationExecutor(ExecutorService executorService) | executorService - экземпляр службы выполнения. | Устанавливает службу выполнения для задач операций. |
setClientNetworkBufferSize(int size) | - size - размер в байтах | Устанавливает размер буфера в пространстве памяти приложения, который используется для копирования данных между сокетом и приложением. Увеличение уменьшает системные вызовы к TCP-стеку, но влияет на то, сколько памяти расходуется на каждое соединение. Этот буфер также подвержен сборке мусора, поскольку соединения имеют короткое время жизни. Также учтите, что выделение большого непрерывного блока памяти может стать проблемой. По умолчанию 300,000 байт. |
retryOnFailures(ClientFaultCause ...causes) | - causes - константа перечисления com.clickhouse.client.api.ClientFaultCause | Устанавливает типы ошибок, которые можно восстановить/повторить. |
setMaxRetries(int maxRetries) | - maxRetries - количество повторов | Устанавливает максимальное количество повторов для ошибок, определяемых retryOnFailures(ClientFaultCause ...causes) |
allowBinaryReaderToReuseBuffers(boolean reuse) | - reuse - флаг, указывающий, следует ли включить опцию | Большинство наборов данных содержат числовые данные, закодированные в виде небольших последовательностей байтов. По умолчанию считыватель будет выделять необходимый буфер, считывать в него данные, а затем преобразовывать в целевой класс Number. Это может вызвать значительное давление на сборщик мусора из-за выделения и освобождения большого количества мелких объектов. Если эта опция включена, считыватель будет использовать предварительно выделенные буферы для выполнения преобразования чисел. Это безопасно, потому что каждый считыватель имеет свой собственный набор буферов, и считыватели используются одним потоком. |
httpHeader(String key, String value) | - key - ключ HTTP заголовка.- value - строковое значение заголовка. | Устанавливает значение для одного HTTP заголовка. Предыдущее значение будет переопределено. |
httpHeader(String key, Collection values) | - key - ключ HTTP заголовка.- values - список строковых значений. | Устанавливает значения для одного HTTP заголовка. Предыдущее значение будет переопределено. |
httpHeaders(Map headers) | - header - карта с HTTP заголовками и их значениями. | Устанавливает несколько значений HTTP заголовков за раз. |
serverSetting(String name, String value) | - name - имя параметра настройки на уровне запроса.- value - строковое значение настройки. | Устанавливает, какие настройки передавать серверу вместе с каждым запросом. Индивидуальные настройки операций могут переопределять это. Список настроек |
serverSetting(String name, Collection values) | - name - имя параметра настройки на уровне запроса.- values - строковые значения настройки. | Устанавливает, какие настройки передавать серверу вместе с каждым запросом. Индивидуальные настройки операций могут переопределять это. Список настроек. Этот метод полезен для установки настроек с несколькими значениями, например роли |
columnToMethodMatchingStrategy(ColumnToMethodMatchingStrategy strategy) | - strategy - реализация стратегии соответствия столбца и метода | Устанавливает пользовательскую стратегию для сопоставления полей класса DTO и столбцов БД при регистрации DTO. |
useHTTPBasicAuth(boolean useBasicAuth) | - useBasicAuth - флаг, указывающий, следует ли включить опцию | Устанавливает, должен ли использоваться базовый HTTP аутентификация для аутентификации по имени пользователя и паролю. По умолчанию включено. Использование этого типа аутентификации решает проблемы с паролями, содержащими специальные символы, которые невозможно передать через HTTP заголовки. |
setClientName(String clientName) | - clientName - строка, представляющая имя приложения | Устанавливает дополнительную информацию о вызываемом приложении. Эта строка будет передана серверу как имя клиента. В случае протокола HTTP она будет передана как заголовок User-Agent . |
useBearerTokenAuth(String bearerToken) | - bearerToken - закодированный токен доступа | Указывает, следует ли использовать Bearer аутентификацию и какой токен использовать. Токен будет отправлен как есть, поэтому он должен быть закодирован перед передачей в этот метод. |
Общие определения
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 (объект передачи данных).
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() | Возвращает идентификатор запроса, назначенный операции приложением (через настройки операции или сервером). |
Query 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
. Возвращает результат в виде коллекции. Производительность чтения такая же, как и у читателя, но требуется больше памяти для хранения всего набора данных.
Подписи
Параметры
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 в ответе. |
Examples
- Пример кода доступен в репозитории
- Ссылка на реализацию Spring Service
Common API
getTableSchema(String table)
Извлекает схему таблицы для table
.
Подписи
Параметры
table
- имя таблицы, для которой должны быть извлечены данные схемы.
database
- база данных, где определена целевая таблица.
Возвращаемое значение
Возвращает объект TableSchema
со списком столбцов таблицы.
getTableSchemaFromQuery(String sql)
Извлекает схему из SQL выражения.
Подписи
Параметры
sql
- SQL выражение "SELECT", для которого должна быть возвращена схема.
Возвращаемое значение
Возвращает объект TableSchema
со столбцами, соответствующими sql
выражению.
TableSchema
register(Class<?> clazz, TableSchema schema)
Компилирует уровень сериализации и десериализации для Java класса, который будет использоваться для записи/чтения данных с использованием schema
. Метод создаст сериализатор и десериализатор для связанных методов доступа и соответствующего столбца.
Сопоставление столбца осуществляется путем извлечения его имени из имени метода. Например, getFirstName
будет соответствовать столбцу first_name
или firstname
.
Подписи
Параметры
clazz
- класс, представляющий POJO, используемый для чтения/записи данных.
schema
- схема данных, которую следует использовать для сопоставления с свойствами POJO.
Примеры
Usage Examples
Полные примеры кода хранятся в репозитории в папке 'example' folder:
- client-v2 - основной набор примеров.
- demo-service - пример использования клиента в приложении Spring Boot.
- demo-kotlin-service - пример использования клиента в приложении Ktor (Kotlin).