メインコンテンツへスキップ
メインコンテンツへスキップ

Java クライアント

DBサーバーとそのプロトコル経由で通信するための Java クライアントライブラリです。現在の実装では、HTTP インターフェイス のみをサポートしています。 このライブラリは、サーバーにリクエストを送信するための独自 API を提供します。また、さまざまなバイナリデータ形式(RowBinary* および Native*)を扱うためのツールも提供します。

セットアップ


<dependency>
    <groupId>com.clickhouse</groupId>
    <artifactId>client-v2</artifactId>
    <version>0.9.1</version>
</dependency>

初期化

Client オブジェクトは com.clickhouse.client.api.Client.Builder#build() によって初期化されます。各クライアントはそれぞれ独自のコンテキストを持ち、オブジェクトがクライアント間で共有されることはありません。 Builder には、簡単にセットアップできるようにするための設定メソッドが用意されています。

例:

 Client client = new Client.Builder()
                .addEndpoint("https://clickhouse-cloud-instance:8443/")
                .setUsername(user)
                .setPassword(password)
                .build();

ClientAutoCloseable を実装しているため、不要になったら必ずクローズしてください。

認証

認証は初期化フェーズでクライアントごとに構成します。サポートされている認証方法は 3 つあります: パスワード認証、アクセストークン認証、SSL クライアント証明書認証です。

パスワード認証を行う場合は、setUsername(String)setPassword(String) を呼び出してユーザー名とパスワードを設定する必要があります。

 Client client = new Client.Builder()
        .addEndpoint("https://clickhouse-cloud-instance:8443/")
        .setUsername(user)
        .setPassword(password)
        .build();

アクセストークンによる認証を行うには、setAccessToken(String) を呼び出してアクセストークンを設定します。

 Client client = new Client.Builder()
        .addEndpoint("https://clickhouse-cloud-instance:8443/")
        .setAccessToken(userAccessToken)
        .build();

SSL クライアント証明書を利用した認証を行うには、setUsername(String) でユーザー名を設定し、useSSLAuthentication(boolean) で SSL 認証を有効にし、setClientCertificate(String) でクライアント証明書を、setClientKey(String) でクライアント鍵をそれぞれ設定する必要があります。

Client client = new Client.Builder()
        .useSSLAuthentication(true)
        .setUsername("some_user")
        .setClientCertificate("some_user.crt")
        .setClientKey("some_user.key")
注記

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"]} のような形式で出力します)

設定

すべての設定は、各値のスコープやコンテキストが明確になるようにするインスタンスメソッド(いわゆる設定メソッド)によって定義されます。 主要な設定パラメータは 1 つのスコープ(クライアントまたは操作)内で定義され、互いに上書きされることはありません。

設定はクライアントの作成時に行います。com.clickhouse.client.api.Client.Builder を参照してください。

クライアント設定

設定方法引数概要
addEndpoint(String endpoint)* endpoint - URL 形式のサーバー アドレス。サーバーのエンドポイントを、利用可能なサーバーの一覧に追加します。現在はエンドポイントは 1 つのみサポートされています。

Default: none
Enum: none
Key: none
addEndpoint(Protocol protocol, String host, int port, boolean secure)- protocol - 接続プロトコル com.clickhouse.client.api.enums.Protocol#HTTP
- host - サーバーの IP またはホスト名。
- secure - 通信にプロトコルのセキュア版 (HTTPS) を使用するかどうか。
利用可能なサーバー一覧にサーバーエンドポイントを追加します。現在、サポートされるエンドポイントは 1 つのみです。

デフォルト値: none
列挙値: none
キー: none
setOption(String key, String value)* key - クライアント構成オプションの文字列キー。
- value - オプションの文字列値。
クライアントオプションの値をそのまま設定します。プロパティファイルから設定を読み込む場合に便利です。
setUsername(String username)- username - 認証時に使用するユーザー名後続の設定で選択される認証方式で使用するユーザー名を設定します

デフォルト: default
列挙値: ClientConfigProperties.USER
キー: user
setPassword(String password)* password - パスワード認証用のシークレット値パスワード認証に用いるシークレットを設定し、実質的にこの方式を認証メソッドとして選択します

Default: -
Enum: ClientConfigProperties.PASSWORD
Key: password
setAccessToken(String accessToken)- accessToken - アクセストークンを表す文字列認証に使用するアクセストークンを設定し、それに対応する認証方式を有効にします

Default: -
Enum: ClientConfigProperties.ACCESS_TOKEN
Key: access_token
useSSLAuthentication(boolean useSSLAuthentication)* useSSLAuthentication - SSL 認証を使用するかどうかを示すフラグSSL クライアント証明書を認証方式として設定します。

デフォルト: -
Enum: ClientConfigProperties.SSL_AUTH
Key: ssl_authentication
enableConnectionPool(boolean enable)- enable - オプションを有効化するかどうかを示すフラグ接続プールを有効にするかどうかを設定します

デフォルト: true
列挙型: ClientConfigProperties.CONNECTION_POOL_ENABLED
キー: connection_pool_enabled
setConnectTimeout(long timeout, ChronoUnit unit)* timeout - 特定の時間単位で指定されたタイムアウト値。
- unit - timeout に対する時間単位
任意のアウトバウンド接続に対する接続開始タイムアウトを設定します。これはソケット接続の確立を待機する時間に影響します。

デフォルト: -
列挙値: ClientConfigProperties.CONNECTION_TIMEOUT
キー: connection_timeout
setConnectionRequestTimeout(long timeout, ChronoUnit unit)- timeout - タイムアウト値。
- unit - timeout の時間単位
接続リクエストのタイムアウトを設定します。これは接続プールから接続を取得する場合にのみ有効です。

デフォルト値: 10000
列挙値: ClientConfigProperties.CONNECTION_REQUEST_TIMEOUT
キー: connection_request_timeout
setMaxConnections(int maxConnections)* maxConnections - 最大接続数クライアントが各サーバーエンドポイントごとに確立できる最大同時接続数を設定します。

デフォルト: 10
列挙値: ClientConfigProperties.HTTP_MAX_OPEN_CONNECTIONS
キー: max_open_connections
setConnectionTTL(long timeout, ChronoUnit unit)- timeout - ある時間単位で表したタイムアウト値。
- unit - timeout の時間単位
接続の TTL を設定します。この時間を過ぎると接続は非アクティブと見なされます

デフォルト: -1
Enum: ClientConfigProperties.CONNECTION_TTL
Key: connection_ttl
setKeepAliveTimeout(long timeout, ChronoUnit unit)* timeout - ある時間単位で指定されたタイムアウト値。
- unit - timeout の時間単位
HTTP 接続における Keep-Alive のタイムアウトを設定します。タイムアウトを 0 に設定することで、Keep-Alive を無効化することができます。

デフォルト: -
列挙型: ClientConfigProperties.HTTP_KEEP_ALIVE_TIMEOUT
キー: http_keep_alive_timeout
setConnectionReuseStrategy(ConnectionReuseStrategy strategy)- strategy - enum com.clickhouse.client.api.ConnectionReuseStrategy の定数値接続プールが使用する再利用戦略を選択します。LIFO を選択すると、接続がプールに返却されるとすぐに再利用されます。FIFO を選択すると、利用可能になった順番で接続を使用します(返却された接続は直ちには再利用されません)。

デフォルト: FIFO
Enum: ClientConfigProperties.CONNECTION_REUSE_STRATEGY
Key: connection_reuse_strategy
setSocketTimeout(long timeout, ChronoUnit unit)`*timeout- タイムアウト値。ある時間単位で指定します。
-unit-timeoutの時間単位
ソケットの読み取りおよび書き込み処理に影響するタイムアウトを設定します

デフォルト:0
列挙型:ClientConfigProperties.SOCKET&#95;OPERATION&#95;TIMEOUT
キー:socket&#95;timeout
setSocketRcvbuf(long size)-size- サイズ(バイト単位)TCP ソケットの受信バッファを設定します。このバッファは JVM が管理するメモリ領域の外側に確保されます。

デフォルト:8196
Enum:ClientConfigProperties.SOCKET&#95;RCVBUF&#95;OPT
Key:socket&#95;rcvbuf
setSocketSndbuf(long size)*size- バイト数TCP ソケットの受信バッファを設定します。このバッファは JVM メモリの外側に確保されます。

デフォルト:8196
Enum:ClientConfigProperties.SOCKET&#95;SNDBUF&#95;OPT
Key:socket&#95;sndbuf
setSocketKeepAlive(boolean value)-value- オプションを有効化するかどうかを示すフラグ。クライアントによって作成されるすべての TCP ソケットに対して、オプションSO&#95;KEEPALIVEを設定します。TCP Keep-Alive は接続の生存状態を確認するメカニズムを有効にし、予期せず切断された接続を検出するのに役立ちます。

デフォルト: -
Enum:ClientConfigProperties.SOCKET&#95;KEEPALIVE&#95;OPT
Key:socket&#95;keepalive
setSocketTcpNodelay(boolean value)*value- オプションを有効にするかどうかを示すフラグ。クライアントによって作成されるすべての TCP ソケットに対してオプションSO&#95;NODELAYを設定します。この TCP オプションにより、ソケットは可能な限り早くデータを送信します。

デフォルト: -
Enum:ClientConfigProperties.SOCKET&#95;TCP&#95;NO&#95;DELAY&#95;OPT
Key:socket&#95;tcp&#95;nodelay
setSocketLinger(int secondsToWait)-secondsToWait- 待機する秒数。クライアントが作成するすべての TCP ソケットに対して linger 時間を設定します。

デフォルト: -
Enum:ClientConfigProperties.SOCKET&#95;LINGER&#95;OPT
Key:socket&#95;linger
compressServerResponse(boolean enabled)*enabled- オプションを有効化するかどうかを示すフラグサーバーがレスポンスを圧縮するかどうかを設定します。

デフォルト:true
列挙値:ClientConfigProperties.COMPRESS&#95;SERVER&#95;RESPONSE
キー:compress
compressClientRequest(boolean enabled)-enabled- このオプションを有効化するかどうかを示すフラグクライアント側が送信リクエストを圧縮するかどうかを設定します。

デフォルト:false
Enum:ClientConfigProperties.COMPRESS&#95;CLIENT&#95;REQUEST
Key:decompress
useHttpCompression(boolean enabled)*enabled- オプションを有効化するかどうかを示すフラグ対応するオプションが有効になっている場合に、クライアント/サーバー間の通信で HTTP 圧縮を使用するかどうかを設定します
appCompressedData(boolean enabled)-enabled- オプションを有効化するかどうかを示すフラグクライアントに、圧縮はアプリケーション側で処理されることを通知します。

デフォルト:false
Enum:ClientConfigProperties.APP&#95;COMPRESSED&#95;DATA
Key:app&#95;compressed&#95;data
setLZ4UncompressedBufferSize(int size)*size- サイズ(バイト単位)非圧縮データストリームの一部を受信するバッファのサイズを設定します。バッファサイズが不足している場合は新しいバッファが作成され、その旨の警告がログに出力されます。

Default:65536
Enum:ClientConfigProperties.COMPRESSION&#95;LZ4&#95;UNCOMPRESSED&#95;BUF&#95;SIZE
Key:compression.lz4.uncompressed&#95;buffer&#95;size
disableNativeCompression-disable - オプションを無効にするかどうかを示すフラグネイティブ圧縮を無効にします。trueに設定すると、ネイティブ圧縮が無効になります。

デフォルト:false
Enum:ClientConfigProperties.DISABLE&#95;NATIVE&#95;COMPRESSION
Key:disable&#95;native&#95;compression
setDefaultDatabase(String database)*database- データベースの名前既定のデータベースを設定します。

既定値:default
列挙値:ClientConfigProperties.DATABASE
キー:database
addProxy(ProxyType type, String host, int port)-type- プロキシの種類。
-host- プロキシのホスト名または IP アドレス。
-port- プロキシのポート。
サーバーとの通信に使用するプロキシを設定します。プロキシで認証が必要な場合は、このプロキシ設定が必要です。

デフォルト: -
列挙型:ClientConfigProperties.PROXY&#95;TYPE
キー:proxy&#95;type

デフォルト: -
列挙型:ClientConfigProperties.PROXY&#95;HOST
キー:proxy&#95;host

デフォルト: -
列挙型:ClientConfigProperties.PROXY&#95;PORT
キー:proxy&#95;port
setProxyCredentials(String user, String pass)*user- プロキシユーザー名。
-pass- パスワード
プロキシでの認証に使用するユーザー資格情報を設定します。

Default: -
Enum:ClientConfigProperties.PROXY&#95;USER
Key:proxy&#95;user

Default: -
Enum:ClientConfigProperties.PROXY&#95;PASSWORD
Key:proxy&#95;password
setExecutionTimeout(long timeout, ChronoUnit timeUnit)-timeout- タイムアウト値。
-timeUnit-timeoutの時間単位
クエリの最大実行時間を設定します

デフォルト:0
列挙型:ClientConfigProperties.MAX&#95;EXECUTION&#95;TIME
キー:max&#95;execution&#95;time
setHttpCookiesEnabled(boolean enabled)enabled- オプションを有効にするかどうかを示すフラグHTTP クッキーを保持し、サーバーに再送信するかどうかを設定します。
setSSLTrustStore(String path)path- ローカル(クライアント側)システム上のファイルパスサーバーホストの検証にクライアントが SSL トラストストアを使用するかどうかを設定します。

デフォルト: -
列挙値:ClientConfigProperties.SSL&#95;TRUST&#95;STORE
キー:trust&#95;store
setSSLTrustStorePassword(String password)password- シークレット値setSSLTrustStore(String path)で指定された SSL トラストストアのロック解除に使用するパスワードを設定します。

デフォルト: -
Enum:ClientConfigProperties.SSL&#95;KEY&#95;STORE&#95;PASSWORD
Key:key&#95;store&#95;password
setSSLTrustStoreType(String type)type- トラストストアの種類名setSSLTrustStore(String path)で指定されたトラストストアの型を設定します。

デフォルト値: -
列挙型:ClientConfigProperties.SSL&#95;KEYSTORE&#95;TYPE
キー:key&#95;store&#95;type
setRootCertificate(String path)path- ローカル(クライアント側)システム上のファイルのパスクライアントがサーバーホストを検証するために指定したルート (CA) 証明書を使用するかどうかを設定します。

デフォルト: -
列挙型:ClientConfigProperties.CA&#95;CERTIFICATE
キー:sslrootcert
setClientCertificate(String path)path- ローカル(クライアント側)システム上のファイルパスSSL 接続の確立時および SSL 認証で使用するクライアント証明書のパスを設定します。

デフォルト: -
列挙型:ClientConfigProperties.SSL&#95;CERTIFICATE
キー:sslcert
setClientKey(String path)path- ローカル(クライアント側)システム上のファイルのパスサーバーとの SSL 通信を暗号化するために使用するクライアントの秘密鍵を設定します。

デフォルト値: -
Enum:ClientConfigProperties.SSL&#95;KEY
Key:ssl&#95;key
useServerTimeZone(boolean useServerTimeZone)useServerTimeZone- この設定を有効にするかどうかを示すフラグクライアントが DateTime および Date 列の値をデコードする際にサーバーのタイムゾーンを使用するかどうかを指定します。有効にした場合、サーバーのタイムゾーンはsetServerTimeZone(String timeZone)で設定する必要があります。

デフォルト:true
Enum:ClientConfigProperties.USE&#95;SERVER&#95;TIMEZONE
Key:use&#95;server&#95;time&#95;zone
useTimeZone(String timeZone)timeZone - Java で有効なタイムゾーン ID を表す文字列値(java.time.ZoneIdを参照)指定したタイムゾーンを、DateTime および Date 列の値をデコードする際に使用するかどうかを設定します。サーバー側のタイムゾーン設定を上書きします。

デフォルト: -
Enum:ClientConfigProperties.USE&#95;TIMEZONE
Key:use&#95;time&#95;zone
setServerTimeZone(String timeZone)timeZone - Java の有効なタイムゾーン ID を表す文字列値(java.time.ZoneIdを参照)サーバー側のタイムゾーンを設定します。デフォルトでは UTC タイムゾーンが使用されます。

デフォルト:UTC
列挙:ClientConfigProperties.SERVER&#95;TIMEZONE
キー:server&#95;time&#95;zone
useAsyncRequests(boolean async)async- オプションを有効化するかどうかを示すフラグ。クライアントがリクエストを別スレッドで実行するかどうかを設定します。アプリケーション側の方がマルチスレッド処理の設計を適切に行えること、またタスクを別スレッドで実行してもパフォーマンス向上には寄与しないことから、デフォルトでは無効になっています。

デフォルト:false
Enum:ClientConfigProperties.ASYNC&#95;OPERATIONS
Key:async
setSharedOperationExecutor(ExecutorService executorService)executorService- ExecutorService のインスタンス。操作タスク用のexecutor serviceを設定します。

デフォルト:none
Enum:none
Key:none
setClientNetworkBufferSize(int size)*size- バイト数ソケットとアプリケーション間でデータを往復コピーするために使用される、アプリケーションメモリ空間内のバッファのサイズを設定します。値を大きくすると TCP スタックへのシステムコールは減少しますが、接続ごとに消費されるメモリ量に影響します。接続が短時間で終了するため、このバッファも GC(ガーベジコレクション)の対象になります。また、連続した大きなメモリブロックの割り当てが問題になる可能性がある点にも注意してください。

Default:300000
Enum:ClientConfigProperties.CLIENT&#95;NETWORK&#95;BUFFER&#95;SIZE
Key:client&#95;network&#95;buffer&#95;size
retryOnFailures(ClientFaultCause ...causes)-causes-com.clickhouse.client.api.ClientFaultCauseの列挙型定数再試行対象とする障害タイプを設定します。

既定値:NoHttpResponse,ConnectTimeout,ConnectionRequestTimeout
列挙定数:ClientConfigProperties.CLIENT&#95;RETRY&#95;ON&#95;FAILURE
キー:client&#95;retry&#95;on&#95;failures
setMaxRetries(int maxRetries)*maxRetries- 再試行回数retryOnFailures(ClientFaultCause ...causes)で定義された失敗に対する最大再試行回数を設定します

デフォルト:3
列挙型:ClientConfigProperties.RETRY&#95;ON&#95;FAILURE
キー:retry
allowBinaryReaderToReuseBuffers(boolean reuse)-reuse- このオプションを有効にするかどうかを示すフラグほとんどのデータセットには、小さなバイト列としてエンコードされた数値データが含まれます。デフォルトでは、リーダーは必要なバッファーを割り当て、その中にデータを読み込み、その後ターゲットのNumberクラスへ変換します。これは、多数の小さなオブジェクトが割り当ておよび解放されるため、GC に大きな負荷をかける可能性があります。このオプションを有効にすると、リーダーは事前に割り当てられたバッファーを使用して数値のトランスコードを行います。各リーダーは独自のバッファーセットを持ち、かつ各リーダーは単一スレッドからのみ使用されるため、安全に利用できます。
httpHeader(String key, String value)*key- HTTP ヘッダーのキー。
-value- ヘッダー値の文字列。
単一の HTTP ヘッダーに値を設定します。既存の値は上書きされます。

Default:none
Enum:none
Key:none
httpHeader(String key, Collection values)-key- HTTP ヘッダーキー。
-values- 文字列の値のリスト。
1 つの HTTP ヘッダーの値を設定します。既存の値は上書きされます。

デフォルト:none
列挙型:none
キー:none
httpHeaders(Map headers)*header- HTTP ヘッダーとその値のマップ。複数の HTTP ヘッダー値をまとめて設定します。

Default:none
Enum:none
Key:none
serverSetting(String name, String value)-name- クエリレベルの設定名。
-value- 設定値(文字列)。
各クエリとともにサーバーに渡す設定を指定します。個々の操作で設定された値によって上書きされる場合があります。設定の一覧

Default:none
Enum:none
Key:none
serverSetting(String name, Collection values)*name- クエリレベル設定の名前。
-values- 設定の文字列値。
各クエリに対してサーバーへ渡す設定を指定します。個々の操作ごとの設定によって上書きされる場合があります。設定の一覧は List of settings を参照してください。このメソッドは、たとえば roles のように複数の値を持つ設定を指定する場合に便利です。

Default:none
Enum:none
Key:none
columnToMethodMatchingStrategy(ColumnToMethodMatchingStrategy strategy)-strategy- カラムとフィールドの対応付け戦略の実装DTO を登録する際に、DTO クラスのフィールドと DB カラムのマッピングに使用するカスタム戦略を設定します。

デフォルト:none
列挙:none
キー:none
useHTTPBasicAuth(boolean useBasicAuth)*useBasicAuth- オプションを有効化するかどうかを示すフラグユーザー名とパスワードによる認証に Basic HTTP 認証を使用するかどうかを設定します。デフォルトでは有効です。この認証方式を使用すると、HTTP ヘッダー経由では正しく送信できない特殊文字を含むパスワードに関する問題を解消できます。

Default:true
Enum:ClientConfigProperties.HTTP&#95;USE&#95;BASIC&#95;AUTH
Key:http&#95;use&#95;basic&#95;auth
setClientName(String clientName)-clientName - アプリケーション名を表す文字列呼び出し元アプリケーションに関する追加情報を設定します。この文字列はクライアント名としてサーバーに渡されます。HTTP プロトコルを使用する場合は、User-Agentヘッダーとして送信されます。

デフォルト: -
列挙型:ClientConfigProperties.CLIENT&#95;NAME
キー:client&#95;name
useBearerTokenAuth(String bearerToken)*bearerToken- エンコード済みのベアラートークンBearer 認証を使用するかどうかと、使用するトークンを指定します。トークンはそのまま送信されるため、このメソッドに渡す前にエンコードしておく必要があります。

デフォルト: -
Enum:ClientConfigProperties.BEARERTOKEN&#95;AUTH
Key:bearer&#95;token
registerClientMetrics(Object registry, String name)-registry- Micrometer のレジストリインスタンス
-name- メトリクスグループの名前
Micrometer (https://micrometer.io/) のレジストリインスタンスにセンサーを登録します。
setServerVersion(String version)*version- サーバーのバージョンを表す文字列値バージョン検出を行わせないためにサーバーのバージョンを設定します。

デフォルト: -
列挙型:ClientConfigProperties.SERVER&#95;VERSION
キー:server&#95;version
typeHintMapping(Map typeHintMapping)-typeHintMapping- 型ヒントのマッピングClickHouse の型に対する型ヒントのマッピングを設定します。たとえば、多次元配列を独自の Array オブジェクトではなく、Java のコンテナー型として表現できるようにします。

デフォルト: -
Enum:ClientConfigProperties.TYPE&#95;HINT&#95;MAPPING
Key:type&#95;hint&#95;mapping
sslSocketSNI(String sni)*sni- サーバー名を表す文字列値SSL/TLS 接続において SNI(Server Name Indication)として使用するサーバー名を設定します。

デフォルト: -
Enum:ClientConfigProperties.SSL&#95;SOCKET&#95;SNI
キー:ssl&#95;socket&#95;sni

サーバー設定

サーバー側の設定は、作成時にクライアントレベルで一度だけ設定できます(BuilderserverSetting メソッドを参照)。また、各オペレーションのレベルでも設定できます(オペレーション設定クラスの serverSetting を参照)。

 try (Client client = new Client.Builder().addEndpoint(Protocol.HTTP, "localhost", mockServer.port(), false)
        .setUsername("default")
        .setPassword(ClickHouseServerForTest.getPassword())
        .compressClientRequest(true)

        // クライアントレベル
        .serverSetting("max_threads", "10")
        .serverSetting("async_insert", "1")
        .serverSetting("roles", Arrays.asList("role1", "role2"))

        .build()) {

	// 操作レベル
	QuerySettings querySettings = new QuerySettings();
	querySettings.serverSetting("session_timezone", "Europe/Zurich");

	...
}

setOption メソッド(Client.Builder またはオペレーション設定クラスのいずれか)を通じてオプションを設定する場合、サーバー設定の名前には clickhouse_setting_ を接頭辞として付ける必要があります。この場合は com.clickhouse.client.api.ClientConfigProperties#serverSetting() を利用すると便利です。

カスタム HTTP ヘッダー

カスタム HTTP ヘッダーは、すべての操作(クライアントレベル)または特定の 1 つの操作(オペレーションレベル)に対して設定できます。


QuerySettings settings = new QuerySettings()
    .httpHeader(HttpHeaders.REFERER, clientReferer)
    .setQueryId(qId);

オプションを setOption メソッド(Client.Builder またはオペレーション設定クラス)で指定する場合は、カスタムヘッダー名の先頭に http_header_ を付ける必要があります。この場合は、com.clickhouse.client.api.ClientConfigProperties#httpHeader() メソッドが役立ちます。

共通定義

ClickHouseFormat

サポートされているフォーマット の列挙型です。ClickHouse がサポートするすべてのフォーマットが含まれます。

  • raw - ユーザーが生データを自分でトランスコードする必要がある
  • full - クライアント側でデータをトランスコードでき、生データストリームを受け入れられる
  • - - このフォーマットでは ClickHouse が操作をサポートしていないことを示す

このクライアントバージョンでサポートされる内容:

形式入力出力
TabSeparatedraw未加工
TabSeparatedRaw未加工生データ
TabSeparatedWithNames未加工raw
TabSeparatedWithNamesAndTypes未加工データ未加工
TabSeparatedRawWithNamesraw未加工
TabSeparatedRawWithNamesAndTypes生データraw
テンプレートrawraw
TemplateIgnoreSpacesRAW*
CSV未加工生データ
CSVWithNames生データ生データ
CSVWithNamesAndTypes未加工未加工
CustomSeparated未加工raw
CustomSeparatedWithNames未加工raw
CustomSeparatedWithNamesAndTypesraw未加工
SQLInsert-raw
Valuesrawraw
Vertical*未加工
JSON未処理未加工
JSONAsString未加工-
JSONAsObject生データ*
JSONStrings未加工未加工
JSONColumnsraw生データ
JSONColumnsWithMetadata生データ未加工
JSONCompact生データ未加工
JSONCompactStrings-生データ
JSONCompactColumns生データ未加工
JSONEachRow生データ生データ
PrettyJSONEachRow*raw
JSONEachRowWithProgress-生データ
JSONStringsEachRow未加工Raw
JSONStringsEachRowWithProgress*raw
JSONCompactEachRow生データ未加工
JSONCompactEachRowWithNames生データ未加工
JSONCompactEachRowWithNamesAndTypes未加工未加工
JSONCompactStringsEachRowRAW生データ
JSONCompactStringsEachRowWithNames未加工未加工
JSONCompactStringsEachRowWithNamesAndTypesrawraw
JSONObjectEachRow未加工未加工
BSONEachRowraw未加工
TSKV未加工未加工
Pretty-未加工
PrettyNoEscapes*生データ
PrettyMonoBlock-生データ
PrettyNoEscapesMonoBlock*生データ
PrettyCompact-raw
PrettyCompactNoEscapes*未加工
PrettyCompactMonoBlock-生データ
PrettyCompactNoEscapesMonoBlock*Raw
PrettySpace-生データ
PrettySpaceNoEscapes*未加工
PrettySpaceMonoBlock-raw
PrettySpaceNoEscapesMonoBlock*未加工
Prometheus-生データ
Protobuf未加工未加工
ProtobufSingle未加工未加工
ProtobufList未加工生データ
Avro未加工生データ
AvroConfluent生データ*
Parquet未加工生データ
ParquetMetadataraw-
Arrowraw未加工
ArrowStream生データ未加工
ORC未加工raw
Oneraw*
Npy未加工未加工
RowBinary完全フル
RowBinaryWithNamesフル完全
RowBinaryWithNamesAndTypesフル完全
RowBinaryWithDefaultsフル-
Nativeフル生データ
Null*RAW
XML-生データ
CapnProto生データ未加工
LineAsString未加工生データ
Regexp未加工*
RawBLOBraw未加工
MsgPackraw未加工
MySQLDumpRAW-
DWARF未加工*
Markdown-生データ
Form未加工*

Insert API(挿入 API)

insert(String tableName, InputStream data, ClickHouseFormat format)

指定されたフォーマットのバイトデータを InputStream として受け取ります。dataformat でエンコードされていることが想定されています。

シグネチャ

CompletableFuture<InsertResponse> insert(String tableName, InputStream data, ClickHouseFormat format, InsertSettings settings)
CompletableFuture<InsertResponse> insert(String tableName, InputStream data, ClickHouseFormat format)

パラメーター

tableName - 挿入先テーブル名。

data - エンコード済みデータの入力ストリーム。

format - データがエンコードされているフォーマット。

settings - リクエスト設定。

戻り値

InsertResponse 型の Future - 操作結果およびサーバー側メトリクスなどの追加情報。

try (InputStream dataStream = getDataStream()) {
    try (InsertResponse response = client.insert(TABLE_NAME, dataStream, ClickHouseFormat.JSONEachRow,
            insertSettings).get(3, TimeUnit.SECONDS)) {

        log.info("挿入完了: {} 行を書き込みました", response.getMetrics().getMetric(ServerMetrics.NUM_ROWS_WRITTEN).getLong());
    } catch (Exception e) {
        log.error("JSONEachRow データの書き込みに失敗しました", e);
        throw new RuntimeException(e);
    }
}

insert(String tableName, List<?> data, InsertSettings settings)

データベースに書き込みリクエストを送信します。オブジェクトのリストは効率的なフォーマットに変換されてからサーバーに送信されます。リスト要素のクラスは、事前に register(Class, TableSchema) メソッドを使用して登録しておく必要があります。

シグネチャ

client.insert(String tableName, List<?> data, InsertSettings settings)
client.insert(String tableName, List<?> data)

パラメータ

tableName - 挿入先テーブル名。

data - DTO(Data Transfer Object)オブジェクトのコレクション。

settings - リクエスト設定。

戻り値

InsertResponse 型の Future - 操作結果およびサーバー側メトリクスなどの追加情報。

// 重要な手順(一度のみ実行)- テーブルスキーマに基づいてオブジェクトシリアライザを事前コンパイルするためにクラスを登録します。 
client.register(ArticleViewEvent.class, client.getTableSchema(TABLE_NAME));

List<ArticleViewEvent> events = loadBatch();

try (InsertResponse response = client.insert(TABLE_NAME, events).get()) {
    // レスポンスを処理した後、クローズされ、リクエストを処理した接続が解放されます。 
}

insert(String tableName, DataStreamWriter writer, ClickHouseFormat format, InsertSettings settings)

ベータ版

この API メソッドでは、データを出力ストリームに直接エンコードする writer オブジェクトを渡すことができます。データはクライアント側で圧縮されます。 InsertSettings には appCompressedData という設定オプションがあり、クライアント側での圧縮を無効にして、アプリケーション側から圧縮済みストリームを送信できるようにします。 以下の例は、この API が想定している主なユースケースを示しています。

com.clickhouse.client.api.DataStreamWriter は、出力ストリームがデータを書き込み可能な状態になったタイミングでクライアントによって呼び出される onOutput メソッドを持つ関数型インターフェイスです。このインターフェイスには、デフォルト実装を持つ onRetry という別のメソッドもあります。このメソッドはリトライ処理がトリガーされた際に呼び出され、主に必要に応じてデータソースをリセットするために使用されます。

シグネチャ

CompletableFuture<InsertResponse> insert(String tableName,              // 挿入先テーブル名
                                         DataStreamWriter writer,       // データライターインスタンス
                                         ClickHouseFormat format,       // ライターがデータをエンコードする形式
                                         InsertSettings settings)       // 操作設定

パラメータ

tableName - 挿入先テーブルの名前。

writer - データライターのインスタンス。

format - writer がデータをエンコードする際のデータ形式。

settings - リクエストの設定。

戻り値

InsertResponse 型の Future - 操作結果およびサーバー側メトリクスなどの追加情報。

文字列値としてエンコードされた JSON オブジェクトのコレクションを、JSONEachRow 形式で書き込む場合:


final int EXECUTE_CMD_TIMEOUT = 10; // 秒
final String tableName = "events";
final String tableCreate = "CREATE TABLE \"" + tableName + "\" " +
        " (name String, " +
        "  v1 Float32, " +
        "  v2 Float32, " +
        "  attrs Nullable(String), " +
        "  corrected_time DateTime('UTC') DEFAULT now()," +
        "  special_attr Nullable(Int8) DEFAULT -1)" +
        "  Engine = MergeTree ORDER by ()";

client.execute("DROP TABLE IF EXISTS " + tableName).get(EXECUTE_CMD_TIMEOUT, TimeUnit.SECONDS);
client.execute(createTableSQL).get(EXECUTE_CMD_TIMEOUT, TimeUnit.SECONDS);

String correctedTime = Instant.now().atZone(ZoneId.of("UTC")).format(DataTypeUtils.DATETIME_FORMATTER);
String[] rows = new String[] {
        "{ \"name\": \"foo1\", \"v1\": 0.3, \"v2\": 0.6, \"attrs\": \"a=1,b=2,c=5\", \"corrected_time\": \"" + correctedTime + "\", \"special_attr\": 10}",
        "{ \"name\": \"foo1\", \"v1\": 0.3, \"v2\": 0.6, \"attrs\": \"a=1,b=2,c=5\", \"corrected_time\": \"" + correctedTime + "\"}",
        "{ \"name\": \"foo1\", \"v1\": 0.3, \"v2\": 0.6, \"attrs\": \"a=1,b=2,c=5\" }",
        "{ \"name\": \"foo1\", \"v1\": 0.3, \"v2\": 0.6 }",
};


try (InsertResponse response = client.insert(tableName, out -> {
    // 生バイトの書き込み 
    for (String row : rows) {
        out.write(row.getBytes());
    }

}, ClickHouseFormat.JSONEachRow, new InsertSettings()).get()) {

    System.out.println("書き込まれた行: " + response.getWrittenRows());
}

既に圧縮済みのデータの書き込み:

String tableName = "very_long_table_name_with_uuid_" + UUID.randomUUID().toString().replace('-', '_');
String tableCreate = "CREATE TABLE \"" + tableName + "\" " +
        " (name String, " +
        "  v1 Float32, " +
        "  v2 Float32, " +
        "  attrs Nullable(String), " +
        "  corrected_time DateTime('UTC') DEFAULT now()," +
        "  special_attr Nullable(Int8) DEFAULT -1)" +
        "  Engine = MergeTree ORDER by ()";

client.execute("DROP TABLE IF EXISTS " + tableName).get(EXECUTE_CMD_TIMEOUT, TimeUnit.SECONDS);
client.execute(createTableSQL).get(EXECUTE_CMD_TIMEOUT, TimeUnit.SECONDS);

String correctedTime = Instant.now().atZone(ZoneId.of("UTC")).format(DataTypeUtils.DATETIME_FORMATTER);
String[] data = new String[] {
        "{ \"name\": \"foo1\", \"v1\": 0.3, \"v2\": 0.6, \"attrs\": \"a=1,b=2,c=5\", \"corrected_time\": \"" + correctedTime + "\", \"special_attr\": 10}",
        "{ \"name\": \"foo1\", \"v1\": 0.3, \"v2\": 0.6, \"attrs\": \"a=1,b=2,c=5\", \"corrected_time\": \"" + correctedTime + "\"}",
        "{ \"name\": \"foo1\", \"v1\": 0.3, \"v2\": 0.6, \"attrs\": \"a=1,b=2,c=5\" }",
        "{ \"name\": \"foo1\", \"v1\": 0.3, \"v2\": 0.6 }",
};


// このステップはデモンストレーション用です。実際のアプリケーションではデータは既に圧縮されています。 
byte[][] compressedData = new byte[data.length][];
for (int i = 0 ; i < data.length; i++) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    GZIPOutputStream gz = new GZIPOutputStream(baos);
    gz.write(data[i].getBytes(StandardCharsets.UTF_8));
    gz.finish();
    compressedData[i] = baos.toByteArray();
}

InsertSettings insertSettings = new InsertSettings()
        .appCompressedData(true, "gzip"); // 圧縮アルゴリズムを定義(HTTPヘッダー経由で送信)

try (InsertResponse response = client.insert(tableName, out -> {
    // データを書き込み 
    for (byte[] row : compressedData) {
        out.write(row);
    }
}, ClickHouseFormat.JSONEachRow, insertSettings).get()) {
    System.out.println("書き込まれた行数: " + response.getWrittenRows());
}    

InsertSettings

挿入操作に関する構成オプション。

構成方法

MethodDescription
setQueryId(String queryId)操作に割り当てられるクエリ ID を設定します。デフォルト: null
setDeduplicationToken(String token)重複排除トークンを設定します。このトークンはサーバーに送信され、クエリを識別するために使用できます。デフォルト: null
setInputStreamCopyBufferSize(int size)コピー用バッファサイズです。バッファは、ユーザーが提供した入力ストリームから出力ストリームへデータを書き込む際のコピーに使用されます。デフォルト: 8196
serverSetting(String name, String value)操作ごとの個別のサーバー設定を行います。
serverSetting(String name, Collection values)操作ごとに複数値を持つ個別のサーバー設定を行います。コレクション内の要素は String 値である必要があります。
setDBRoles(Collection dbRoles)操作を実行する前に設定する DB ロールを指定します。コレクション内の要素は String 値である必要があります。
setOption(String option, Object value)構成オプションを生の形式で設定します。これはサーバー設定ではありません。

InsertResponse

挿入操作の結果を保持するレスポンスオブジェクトです。これはクライアントがサーバーからレスポンスを受信した場合にのみ使用できます。

注記

このオブジェクトは、できるだけ早くクローズして接続を解放する必要があります。前のレスポンスのすべてのデータが完全に読み込まれるまで、その接続は再利用できないためです。

MethodDescription
OperationMetrics getMetrics()操作メトリクスを保持するオブジェクトを返します。
String getQueryId()アプリケーション(操作設定経由、またはサーバー)によってこの操作に割り当てられたクエリ ID を返します。

クエリ API

query(String sqlQuery)

sqlQuery をそのまま送信します。レスポンス形式はクエリ設定によって決まります。QueryResponse は、その形式をサポートするリーダーによって消費されるべきレスポンスストリームへの参照を保持します。

シグネチャ

CompletableFuture<QueryResponse> query(String sqlQuery, QuerySettings settings)
CompletableFuture<QueryResponse> query(String sqlQuery)

パラメーター

sqlQuery - 単一の SQL ステートメント。クエリはそのままサーバーに送信されます。

settings - リクエスト設定。

戻り値

QueryResponse 型の Future - 結果データセットと、サーバー側メトリクスなどの追加情報。データセットの処理が完了したら、Response オブジェクトをクローズする必要があります。

final String sql = "select * from " + TABLE_NAME + " where title <> '' limit 10";

// デフォルトフォーマットはRowBinaryWithNamesAndTypesFormatReaderのため、リーダーはカラムに関するすべての情報を持ちます
try (QueryResponse response = client.query(sql).get(3, TimeUnit.SECONDS);) {

    // データに便利にアクセスするためのリーダーを作成
    ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(response);

    while (reader.hasNext()) {
        reader.next(); // ストリームから次のレコードを読み取り、パース

        // 値を取得
        double id = reader.getDouble("id");
        String title = reader.getString("title");
        String url = reader.getString("url");

        // データを収集 
    }
} catch (Exception e) {
    log.error("データの読み取りに失敗しました", e);
}

// HTTP接続を速やかに解放するため、ビジネスロジックは読み取りブロックの外に配置すること  

query(String sqlQuery, Map<String, Object> queryParams, QuerySettings settings)

sqlQuery をそのまま送信します。加えて、サーバーが SQL 式をコンパイルできるようにクエリパラメータも送信します。

シグネチャ

CompletableFuture<QueryResponse> query(String sqlQuery, Map<String, Object> queryParams, QuerySettings settings)

パラメータ

sqlQuery - プレースホルダー {} を含む SQL 式。

queryParams - サーバー側で SQL 式を補完するための変数マップ。

settings - リクエスト設定。

戻り値

QueryResponse 型の Future - 結果データセットおよびサーバー側メトリクスなどの追加情報。データセットの処理が完了したら、Response オブジェクトをクローズする必要があります。


// パラメータを定義します。リクエストと共にサーバーに送信されます。   
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("param1", 2);

try (QueryResponse response =
        client.query("SELECT * FROM " + table + " WHERE col1 >= {param1:UInt32}", queryParams, new QuerySettings()).get()) {

    // データにアクセスするためのリーダーを作成します
    ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(response);

    while (reader.hasNext()) {
        reader.next(); // ストリームから次のレコードを読み取り、パースします

        // データを読み取ります 
    }

} catch (Exception e) {
    log.error("データの読み取りに失敗しました", e);
}

queryAll(String sqlQuery)

RowBinaryWithNamesAndTypes 形式のデータに対してクエリを実行します。結果はコレクションとして返されます。読み取りパフォーマンスはリーダー利用時と同等ですが、データセット全体を保持するため、より多くのメモリを消費します。

シグネチャ

List<GenericRecord> queryAll(String sqlQuery)

パラメータ

sqlQuery - サーバーからデータを取得するための SQL クエリ式。

戻り値

結果データに行単位でアクセスできる GenericRecord オブジェクトのリストとして表される、完全なデータセット。

try {
    log.info("テーブル全体を読み込み、レコードを1件ずつ処理します");
    final String sql = "select * from " + TABLE_NAME + " where title <> ''";

    // 結果セット全体を読み込み、レコードを1件ずつ処理
    client.queryAll(sql).forEach(row -> {
        double id = row.getDouble("id");
        String title = row.getString("title");
        String url = row.getString("url");

        log.info("id: {}, title: {}, url: {}", id, title, url);
    });
} catch (Exception e) {
    log.error("データの読み込みに失敗しました", e);
}

QuerySettings

クエリ操作向けの設定オプション。

設定方法

MethodDescription
setQueryId(String queryId)操作に割り当てるクエリ ID を設定します。
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)操作を実行する前に設定する DB ロールを指定します。コレクションの要素は String 値である必要があります。
setOption(String option, Object value)生の形式で設定オプションを指定します。これはサーバー設定ではありません。

QueryResponse

クエリ実行の結果を保持するレスポンスオブジェクトです。クライアントがサーバーからレスポンスを受信できた場合にのみ利用可能です。

注記

このオブジェクトは、接続を解放するためにできるだけ早くクローズする必要があります。前のレスポンスのすべてのデータが完全に読み込まれるまで、その接続は再利用できないためです。

MethodDescription
ClickHouseFormat getFormat()レスポンス内のデータがエンコードされているフォーマットを返します。
InputStream getInputStream()指定されたフォーマットでの非圧縮バイトストリームを返します。
OperationMetrics getMetrics()オペレーションメトリクスを含むオブジェクトを返します。
String getQueryId()アプリケーション(オペレーション設定またはサーバー)によってこのオペレーションに割り当てられたクエリ ID を返します。
TimeZone getTimeZone()レスポンス内の Date/DateTime 型を扱う際に使用すべきタイムゾーンを返します。

  • サンプルコードはリポジトリで参照できます
  • Spring Service の実装を参照してください

共通 API

getTableSchema(String table)

テーブル table のスキーマを取得します。

シグネチャ

TableSchema getTableSchema(String table)
TableSchema getTableSchema(String table, String database)

パラメーター

table - スキーマ情報を取得するテーブル名。

database - 対象テーブルが定義されているデータベース名。

戻り値

テーブルのカラム一覧を含む TableSchema オブジェクトを返します。

getTableSchemaFromQuery(String sql)

SQL ステートメントからスキーマを取得します。

シグネチャ

TableSchema getTableSchemaFromQuery(String sql)

パラメーター

sql - スキーマを取得する対象の SELECT 文。

戻り値

sql で指定したクエリに対応する列を持つ TableSchema オブジェクトを返します。

TableSchema

register(Class<?> clazz, TableSchema schema)

Java クラスに対して、schema を用いたデータの読み書きに使用するシリアライズ/デシリアライズ処理をコンパイルします。このメソッドは、getter/setter と対応するカラムのペアごとにシリアライザとデシリアライザを作成します。 カラムの対応付けは、メソッド名から抽出した名前に基づいて行われます。たとえば、getFirstName はカラム first_name または firstname に対応します。

シグネチャ

void register(Class<?> clazz, TableSchema schema)

パラメータ

clazz - データの読み取り/書き込みに用いる POJO を表すクラス。

schema - POJO のプロパティに対応付けるために使用するデータスキーマ。

使用例

client.register(ArticleViewEvent.class, client.getTableSchema(TABLE_NAME));

使用例

完全なサンプルコードはリポジトリ内の example フォルダにあります:

  • client-v2 - 主なサンプル集。
  • demo-service - Spring Boot アプリケーションでクライアントを使用する方法を示すサンプル。
  • demo-kotlin-service - Ktor (Kotlin) アプリケーションでクライアントを使用する方法を示すサンプル。