Java クライアント
DBサーバーとそのプロトコルを通じて通信するためのJavaクライアントライブラリ。現在の実装ではHTTPインターフェースのみをサポートしています。 このライブラリは、サーバーへのリクエスト送信用の独自APIを提供します。また、異なるバイナリデータ形式(RowBinary* & Native*)を扱うためのツールも提供します。
セットアップ
- Maven Central (プロジェクトのWebページ) : https://mvnrepository.com/artifact/com.clickhouse/client-v2
- ナイトリービルド (リポジトリへのリンク): https://central.sonatype.com/repository/maven-snapshots/
- 旧Nightlyビルド用 Artifactory (リポジトリリンク) :https://s01.oss.sonatype.org/content/repositories/snapshots/
- Maven
- Gradle (Kotlin)
- Gradle
kotlin // https://mvnrepository.com/artifact/com.clickhouse/client-v2 implementation("com.clickhouse:client-v2:0.9.8")
groovy // https://mvnrepository.com/artifact/com.clickhouse/client-v2 implementation 'com.clickhouse:client-v2:0.9.8'
初期化
Clientオブジェクトは com.clickhouse.client.api.Client.Builder#build() によって初期化されます。各クライアントは独自のコンテキストを持ち、オブジェクトはクライアント間で共有されません。
Builder には設定を簡単に行うための構成メソッドが用意されています。
例:
ClientはAutoCloseableを実装しており、不要になったら必ずクローズする必要があります。
認証
認証は初期化時にクライアントごとに設定します。サポートされている認証方式は3種類あり、パスワード認証、アクセストークン認証、SSL クライアント証明書認証です。
パスワードによる認証では、setUsername(String) と setPassword(String) を呼び出してユーザー名とパスワードを設定する必要があります:
アクセストークンで認証するには、setAccessToken(String) を呼び出してアクセストークンを設定する必要があります:
SSLクライアント証明書による認証を行うには、setUsername(String)、useSSLAuthentication(boolean)、setClientCertificate(String)、setClientKey(String) をそれぞれ呼び出して、ユーザー名の設定、SSL認証の有効化、クライアント証明書とクライアントキーの設定を行う必要があります。
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 を取得します -
設定
すべての設定はインスタンスメソッド (いわゆる構成メソッド) によって定義され、各値のスコープとコンテキストが明確になります。 主要な構成パラメータは1つのスコープ (クライアントまたはオペレーション) で定義され、互いに上書きされることはありません。
設定はクライアントの作成時に定義されます。com.clickhouse.client.api.Client.Builderを参照してください。
クライアント設定
- 接続とエンドポイント
- 認証
- タイムアウトと再試行
- ソケットオプション
- 圧縮
- SSL/セキュリティ
- プロキシ
- HTTP とヘッダー
- サーバー設定
- タイムゾーン
- 進階
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
addEndpoint(String endpoint) | endpoint - URL 形式のサーバーアドレス | 利用可能なサーバーのリストにサーバーエンドポイントを追加します。現在は 1 つのエンドポイントのみがサポートされています。 | none | none |
addEndpoint(Protocol protocol, String host, int port, boolean secure) | protocol - 接続プロトコルhost - IP もしくはホスト名secure - HTTPS を使用するかどうか | 利用可能なサーバーのリストにサーバーエンドポイントを追加します。現在は 1 つのエンドポイントのみがサポートされています。 | none | none |
enableConnectionPool(boolean enable) | enable - 有効/無効を切り替えるフラグ | コネクションプールを有効にするかどうかを設定します。 | true | connection_pool_enabled |
setMaxConnections(int maxConnections) | maxConnections - コネクション数 | 各サーバーエンドポイントに対してクライアントが開くことができる接続数の上限を設定します。 | 10 | max_open_connections |
setConnectionTTL(long timeout, ChronoUnit unit) | timeout - タイムアウト値unit - 時間単位 | 接続が非アクティブと見なされるまでの有効期限 (TTL) を設定します。 | -1 | connection_ttl |
setKeepAliveTimeout(long timeout, ChronoUnit unit) | timeout - タイムアウト値unit - 時間単位 | HTTP 接続の Keep-Alive タイムアウトを設定します。Keep-Alive を無効にするには 0 を設定します。 | - | http_keep_alive_timeout |
setConnectionReuseStrategy(ConnectionReuseStrategy strategy) | strategy - LIFO または FIFO | コネクションプールが使用する接続再利用戦略を選択します。 | FIFO | connection_reuse_strategy |
setDefaultDatabase(String database) | database - データベース名 | デフォルトデータベースを設定します。 | default | database |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setUsername(String username) | username - 認証用のユーザー名 | 追加の設定によって選択される認証方式で使用するユーザー名を設定します | default | user |
setPassword(String password) | password - シークレット値 | パスワード認証用のシークレットを設定し、事実上その認証方式を選択します | - | password |
setAccessToken(String accessToken) | accessToken - アクセストークン文字列 | アクセストークンを設定し、対応する認証方式での認証に使用されるようにします | - | access_token |
useSSLAuthentication(boolean useSSLAuthentication) | useSSLAuthentication - SSL 認証を有効化するフラグ | SSL クライアント証明書を認証方式として使用するように設定します | - | ssl_authentication |
useHTTPBasicAuth(boolean useBasicAuth) | useBasicAuth - 有効/無効を切り替えるフラグ | ユーザー名とパスワードによる認証において、Basic 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 - 有効/無効を示すフラグ | すべての TCP ソケットに対してオプション SO_KEEPALIVE を設定します。TCP Keep-Alive 機構を有効にし、接続の生存状態を監視します。 | - | socket_keepalive |
setSocketTcpNodelay(boolean value) | value - 有効/無効を示すフラグ | すべての TCP ソケットに対してオプション SO_NODELAY を設定します。この TCP オプションにより、ソケットは可能な限り速やかにデータを送信します。 | - | socket_tcp_nodelay |
setSocketLinger(int secondsToWait) | secondsToWait - 秒数 | クライアントが作成するすべての TCP ソケットに対して linger 時間を設定します。 | - | socket_linger |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
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 トラストストアを使用するかどうかを設定します。 | - | trust_store |
setSSLTrustStorePassword(String password) | password - シークレット値 | setSSLTrustStore で指定した SSL トラストストアのロック解除に使用するパスワードを設定します。 | - | key_store_password |
setSSLTrustStoreType(String type) | type - 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 - サーバー名を表す文字列 | SSL/TLS 接続において SNI (Server Name Indication) に使用するサーバー名を設定します。 | - | ssl_socket_sni |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
addProxy(ProxyType type, String host, int port) | type - プロキシの種類host - プロキシのホスト名または IPport - プロキシのポート番号 | サーバーとの通信に使用するプロキシを設定します。 | - | 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 - HTTP ヘッダーを含むマップ | 複数の HTTP ヘッダー値をまとめて設定します。 | none | none |
useHttpFormDataForQuery(boolean enable) | enable - 有効/無効を切り替えるフラグ | クエリパラメータを URL ではなく、リクエストボディ内の HTTP フォームデータとして送信するかどうかを設定します。サーバー側圧縮が有効な場合にのみ動作します。クライアント側の圧縮が有効な場合、各パラメータがマルチパートコンテンツとして送信されるため、パラメータ付きクエリリクエストではクライアント側の圧縮は無効化されます。 | false | client.http.use_form_request_for_query |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
serverSetting(String name, String value) | name - 設定名value - 設定値 | 各クエリとともにサーバーに渡す設定を指定します。個々の操作の設定で上書きされる場合があります。 設定の一覧 | none | none |
serverSetting(String name, Collection values) | name - 設定名values - 設定値のコレクション | 複数の値を持つ設定をサーバーに渡すよう指定します。たとえば roles のようなケースで使用します。 | none | none |
setOption("custom_settings_prefix", value) | value - プレフィックス文字列 | サーバーに渡すカスタム設定のプレフィックスを設定します。サーバー設定に合わせる必要があります。ClickHouse ドキュメント を参照してください。 | custom_ | custom_settings_prefix |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
useServerTimeZone(boolean useServerTimeZone) | useServerTimeZone - 有効/無効を切り替えるフラグ | クライアントが DateTime および Date カラム値をデコードする際に、サーバーのタイムゾーンを使用するかどうかを設定します。 | true | use_server_time_zone |
useTimeZone(String timeZone) | timeZone - Java の有効なタイムゾーン ID | 指定したタイムゾーンを、DateTime および Date カラム値をデコードする際に使用するように設定します。サーバーのタイムゾーン設定を上書きします。 | - | use_time_zone |
setServerTimeZone(String timeZone) | timeZone - Java の有効なタイムゾーン ID | サーバー側のタイムゾーンを設定します。デフォルトでは UTC タイムゾーンが使用されます。 | UTC | server_time_zone |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setOption(String key, String value) | key - 設定オプションのキーvalue - オプション値 | クライアントオプションの生の値を設定します。プロパティファイルから設定を読み込む場合に便利です。 | - | - |
useAsyncRequests(boolean async) | async - 有効/無効を切り替えるフラグ | クライアントがリクエストを別スレッドで実行するかどうかを設定します。マルチスレッド処理の構成はアプリケーション側で制御するほうが適しているため、デフォルトでは無効です。 | false | async |
setSharedOperationExecutor(ExecutorService executorService) | executorService - ExecutorService インスタンス | 操作タスク用の ExecutorService を設定します。 | none | none |
setQueryIdGenerator(Supplier<String> supplier) | supplier - クエリ ID を生成する Supplier<String> | 操作設定 (InsertSettings、QuerySettings) でクエリ ID が指定されていない場合に使用される、カスタムのクエリ ID ジェネレータを設定します。 | - | - |
setClientNetworkBufferSize(int size) | size - バイト単位のサイズ | ソケットとアプリケーションの間でデータをコピーする際に使用される、アプリケーションメモリ空間内のバッファサイズを設定します。 | 300000 | client_network_buffer_size |
allowBinaryReaderToReuseBuffers(boolean reuse) | reuse - 有効/無効を切り替えるフラグ | 有効にすると、リーダーは数値の変換に事前割り当て済みのバッファを再利用します。数値データに対する GC プレッシャーを軽減します。 | - | - |
columnToMethodMatchingStrategy(ColumnToMethodMatchingStrategy strategy) | strategy - マッチング戦略の実装 | DTO の登録時に、DTO クラスのフィールドと DB のカラムをマッチングするために使用するカスタム戦略を設定します。 | none | none |
setClientName(String clientName) | clientName - アプリケーション名文字列 | 呼び出し元アプリケーションに関する追加情報を設定します。User-Agent ヘッダーとして渡されます。 | - | client_name |
registerClientMetrics(Object registry, String name) | registry - Micrometer レジストリインスタンスname - メトリクスグループ名 | Micrometer (https://micrometer.io/) のレジストリインスタンスにセンサーを登録します。 | - | - |
setServerVersion(String version) | version - サーバーバージョン文字列 | バージョン検出を回避するために、サーバーバージョンを設定します。 | - | server_version |
typeHintMapping(Map typeHintMapping) | typeHintMapping - 型ヒントのマップ | ClickHouse 型に対する型ヒントのマッピングを設定します。例えば、多次元配列を Java のコンテナとして扱えるようにする場合に使用します。 | - | type_hint_mapping |
クライアントの識別
クエリログには、リクエストの発信元アプリケーションを識別するフィールドが2つあります: client_name と http_user_agent。ネイティブTCPプロトコルではアプリケーション識別に client_name を使用し、HTTPプロトコルでは http_user_agent を使用します。クライアントビルダーには両プロトコルに対して正しい値を設定する setClientName メソッドがあります。
http_user_agent フィールドは User-Agent ヘッダーの一般的な形式に従って設定されます: application-name[/version] [(operating-system; architecture; ...)]。
この値のセットはアプリケーション、クライアントライブラリ、HTTPクライアントライブラリの各レイヤーごとに繰り返されます。setClientName メソッドで設定されたものがリストの先頭に来ます。
例:
これにより、次の http_user_agent 値が生成されます:
アプリケーションは自身を識別するために独自のHTTPヘッダー User-Agent を設定できます。ただし、clickhouse-java-v2/0.9.6-SNAPSHOT の部分がヘッダーの末尾に追加されます。
操作識別
クエリログには、操作を識別しクエリログに追加情報を付加するために使用できる query_id と log_comment という2つのフィールドがあります。
query_id は操作の一意の識別子です。アプリケーションが QuerySettings クラスの setQueryId メソッドを呼び出すことで設定できます。
log_comment はクエリログに追加できるコメントです。QuerySettings クラスの logComment メソッドを呼び出すことで、アプリケーションから設定できます。
サーバー設定
サーバー側の設定は、クライアント作成時の初期化フェーズに一度だけクライアントレベルで設定できます (BuilderのserverSettingメソッドを参照) 。また、操作ごとに操作レベルでも設定できます (操作設定クラスの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
サポートされている形式の列挙型 (Enum) です。ClickHouse がサポートするすべての形式を含みます。
raw- ユーザー側で生データをトランスコードする必要がありますfull- クライアントがデータのトランスコードを自前で行い、生のデータストリームをそのまま受け取れます-- この形式では ClickHouse がサポートしない操作
このクライアントバージョンでサポートされるのは次のとおりです:
Insert API
insert(String tableName, InputStream data, ClickHouseFormat format)
指定されたフォーマットでエンコードされたバイト列をInputStreamとして受け取ります。dataはformatでエンコードされていることが前提です。
シグネチャ
パラメータ
tableName - 書き込み先テーブルの名前。
data - エンコード済みデータを含む入力ストリーム。
format - データがエンコードされているフォーマット。
settings - リクエストの設定。
戻り値
InsertResponse 型の Future。操作結果およびサーバー側メトリクスなどの追加情報を含みます。
例
insert(String tableName, List<?> data, InsertSettings settings)
データベースに書き込みリクエストを送信します。オブジェクトのリストは効率的な形式に変換され、その後サーバーに送信されます。リスト項目のクラスは register(Class, TableSchema) メソッドを使って事前に登録しておく必要があります。
シグネチャ
パラメータ
tableName - 対象テーブルの名前。
data - DTO (Data Transfer Object) オブジェクトのコレクション。
settings - リクエストの設定。
戻り値
InsertResponse 型の Future — 操作の結果やサーバー側のメトリクスなどの追加情報。
例
InsertSettings
挿入操作の設定オプション。
設定メソッド
| メソッド | 説明 |
|---|---|
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
挿入操作の結果を保持するレスポンスオブジェクト。クライアントがサーバーからレスポンスを受信した場合にのみ利用できます。
このオブジェクトは接続を解放するために、可能な限り早くクローズする必要があります。前のレスポンスのすべてのデータが完全に読み取られるまで、その接続を再利用することはできません。
| メソッド | 説明 |
|---|---|
OperationMetrics getMetrics() | 操作メトリクスを保持するオブジェクトを返します。 |
String getQueryId() | アプリケーション (操作設定経由) またはサーバーによってこの操作に割り当てられたクエリ ID を返します。 |
クエリAPI
query(String sqlQuery)
sqlQueryをそのまま送信します。レスポンス形式はクエリ設定によって決まります。QueryResponseは、対応する形式をサポートするリーダーが読み取るべきレスポンスストリームへの参照を保持します。
シグネチャ
パラメータ
sqlQuery - 単一の SQL 文。クエリはそのままサーバーに送信されます。
settings - リクエストの設定。
戻り値
QueryResponse型の Future — 結果データセットおよびサーバー側メトリクスなどの追加情報。データセットを使い終わったら Response オブジェクトをクローズする必要があります。
例
query(String sqlQuery, Map<String, Object> queryParams, QuerySettings settings)
sqlQueryをそのまま送信します。加えて、サーバーがSQL式をコンパイルできるようにクエリパラメータも送信します。
シグネチャ
パラメータ
sqlQuery - {} プレースホルダーを含む SQL 式。
queryParams - サーバー側で SQL 式を完成させるための変数のマップ。
settings - リクエストの設定。
戻り値
QueryResponse型の Future — 結果データセットおよびサーバー側メトリクスなどの追加情報。データセットを使い終わったら Response オブジェクトをクローズする必要があります。
例
queryAll(String sqlQuery)
RowBinaryWithNamesAndTypes形式でデータをクエリします。結果はコレクションとして返されます。読み取りパフォーマンスはリーダーと同じですが、データセット全体を保持するためにより多くのメモリが必要になります。
シグネチャ
パラメータ
sqlQuery - サーバー上のデータをクエリするための SQL 式。
戻り値
結果データに行単位でアクセスできるGenericRecordオブジェクトのリストで表現される完全なデータセット。
例
QuerySettings
クエリ操作の設定オプション。
設定メソッド
| Method | Description |
|---|---|
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) | 操作に対して、1 つのサーバー設定に複数の値を設定します。コレクションの要素は String 型の値である必要があります。 |
setDBRoles(Collection dbRoles) | 操作の実行前に有効にする DB ロールを設定します。コレクションの要素はすべて String 値である必要があります。 |
setOption(String option, Object value) | 設定オプションを生の形式で設定します。これはサーバー設定ではありません。 |
QueryResponse
クエリの実行結果を保持するレスポンスオブジェクトです。クライアントがサーバーからレスポンスを受け取った場合にのみ利用可能です。
このオブジェクトは接続を解放するために、可能な限り早くクローズする必要があります。前のレスポンスのすべてのデータが完全に読み取られるまで、その接続を再利用することはできません。
| メソッド | 説明 |
|---|---|
ClickHouseFormat getFormat() | レスポンス内のデータがエンコードされているフォーマットを返します。 |
InputStream getInputStream() | 指定されたフォーマットでエンコードされた非圧縮データのバイトストリームを返します。 |
OperationMetrics getMetrics() | 操作メトリクスを保持するオブジェクトを返します。 |
String getQueryId() | アプリケーション (操作設定経由) またはサーバーによって、この操作に割り当てられたクエリ ID を返します。 |
TimeZone getTimeZone() | レスポンス内の Date/DateTime 型を処理する際に使用すべきタイムゾーンを返します。 |
例
共通 API
getTableSchema(String table)
tableテーブルのスキーマを取得します。
シグネチャ
パラメータ
table - スキーマデータを取得する対象テーブル名。
database - 対象テーブルが定義されているデータベース。
戻り値
テーブルのカラム一覧を含む TableSchema オブジェクトを返します。
getTableSchemaFromQuery(String sql)
SQL文からスキーマを取得します。
シグネチャ
パラメータ
sql - スキーマを返すための "SELECT" SQL 文。
戻り値
sql式に対応するカラムを含むTableSchemaオブジェクトを返します。
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) アプリケーションでクライアントを使用する方法のサンプルです。
データの読み込み
データを読み込む一般的な方法は2つあります。
query()メソッドは、データを含むInputStreamを保持する低レベルなQueryResponseオブジェクトを返します。通常はストリーミング読み取りのためにClickHouseBinaryFormatReaderと組み合わせて使用されますが、 他の任意のカスタムリーダー実装でも利用できます。QueryResponseは、結果セットのメタデータおよびメトリクスへのアクセスも提供します。queryAll()メソッドとGenericRecordを使用すると、行単位で結果にアクセスできます。この場合、結果セット全体がメモリに読み込まれます。queryRecords()メソッドはcom.clickhouse.client.api.query.Recordsを返し、これはGenericRecordオブジェクトのイテレータです。このメソッドはストリーミング方式で動作するため (データはメモリにロードされません) 、GenericRecordを利用してデータにアクセスします。
注意: ストリーミング方式ではデータをネットワークストリームから直接読み取るため、高速に読み取る必要があります。そうでない場合、サーバー側の書き込みタイムアウトが発生する可能性があります。
配列の読み込み
ClickHouseBinaryFormatReader メソッド
getList(...)- 任意のArray(...)をList<T>として読み取ります。柔軟に型を扱う読み取りのデフォルトとして適しています。ネストされた配列をサポートします。getByteArray(...),getShortArray(...),getIntArray(...),getLongArray(...),getFloatArray(...),getDoubleArray(...),getBooleanArray(...)- プリミティブ型と互換性のある値からなる一次元配列に最適です。getStringArray(...)-Array(String)型 (および名前で表される enum 値) 用。getObjectArray(...)- ネストされた配列を含む任意のArray(...)要素型に対応する汎用的なオプションです。Nullable な値やネストされた配列を含む配列を読み取るために使用します。
すべてのメソッドに対して、インデックスベースと名前ベースのオーバーロードが利用可能です。インデックスは1始まりです。インデックスベースのメソッドはカラムへ直接アクセスします。 名前ベースのメソッドは、毎回インデックスの検索が必要です。
GenericRecord のメソッド
getList(...)- 任意のArray(...)をList<T>として読み取ります。柔軟な型付き読み取りのデフォルトとして適しています。ネストされた配列をサポートします。getByteArray(...),getShortArray(...),getIntArray(...),getLongArray(...),getFloatArray(...),getDoubleArray(...),getBooleanArray(...)- プリミティブ型互換の値で構成された一次元配列に最適です。getStringArray(...)-Array(String)型 (および名前で表される enum 値) 向け。getObjectArray(...)- ネストされた配列を含む任意のArray(...)要素型に対応する汎用的なオプションです。Nullable な値やネストされた配列を含む配列を読み取るために使用します。
すべてのメソッドに対して、インデックスベースと名前ベースのオーバーロードが利用可能です。インデックスは1始まりです。インデックスベースのメソッドはカラムへ直接アクセスします。 名前ベースのメソッドは、毎回インデックスの検索が必要です。
移行ガイド
Old client (V1) was using com.clickhouse.client.ClickHouseClient#builder as start point. The new client (V2) uses similar pattern with com.clickhouse.client.api.Client.Builder. Main
differences are:
- 実装の取得に ServiceLoader は使用されません。
com.clickhouse.client.api.Clientは、将来的にさまざまな実装に対応するためのファサードクラスです。 - 設定のソースが少なくなりました。1 つは builder に渡され、もう 1 つは操作設定 (
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 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseDefaults#HOST | Client.Builder#addEndpoint | |
ClickHouseDefaults#PROTOCOL | ✗ | Only HTTP supported in V2 |
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 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseDefaults#SSL_CERTIFICATE_TYPE | ✗ | |
ClickHouseDefaults#SSL_KEY_ALGORITHM | ✗ | |
ClickHouseDefaults#SSL_PROTOCOL | ✗ | |
ClickHouseClientOption#SSL | ✗ | See Client.Builder#addEndpoint |
ClickHouseClientOption#SSL_MODE | ✗ | |
ClickHouseClientOption#SSL_ROOT_CERTIFICATE | Client.Builder#setRootCertificate | SSL Auth should be enabled by 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 | ✗ | See Client.Builder#sslSocketSNI to set SNI |
| V1 Configuration | V2 Builder Method | Comments |
|---|---|---|
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 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseClientOption#COMPRESS | Client.Builder#compressServerResponse | See also useHttpCompression |
ClickHouseClientOption#DECOMPRESS | Client.Builder#compressClientRequest | See also useHttpCompression |
ClickHouseClientOption#COMPRESS_ALGORITHM | ✗ | LZ4 for non-http. Http uses Accept-Encoding |
ClickHouseClientOption#DECOMPRESS_ALGORITHM | ✗ | LZ4 for non-http. Http uses Content-Encoding |
ClickHouseClientOption#COMPRESS_LEVEL | ✗ | |
ClickHouseClientOption#DECOMPRESS_LEVEL | ✗ |
| V1 設定 | V2 Builder メソッド | コメント |
|---|---|---|
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 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseClientOption#MAX_EXECUTION_TIME | Client.Builder#setExecutionTimeout | |
ClickHouseClientOption#RETRY | Client.Builder#setMaxRetries | See also 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 Configuration | V2 Builder Method | Comments |
|---|---|---|
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 Configuration | V2 Builder Method | Comments |
|---|---|---|
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 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseDefaults#ASYNCClickHouseClientOption#ASYNC | Client.Builder#useAsyncRequests | |
ClickHouseDefaults#MAX_SCHEDULER_THREADS | ✗ | see setSharedOperationExecutor |
ClickHouseDefaults#MAX_THREADS | ✗ | see setSharedOperationExecutor |
ClickHouseDefaults#THREAD_KEEPALIVE_TIMEOUT | see setSharedOperationExecutor | |
ClickHouseClientOption#MAX_THREADS_PER_CLIENT | ✗ | |
ClickHouseClientOption#MAX_CORE_THREAD_TTL | ✗ |
| V1 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseHttpOption#CUSTOM_HEADERS | Client.Builder#httpHeaders | |
ClickHouseHttpOption#CUSTOM_PARAMS | ✗ | See 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 | ✗ | Always enabled when Apache Http Client is used |
| V1 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseDefaults#FORMATClickHouseClientOption#FORMAT | ✗ | Moved to operation settings (QuerySettings and InsertSettings) |
ClickHouseClientOption#QUERY_ID | ✗ | See QuerySettings and InsertSettings |
ClickHouseClientOption#LOG_LEADING_COMMENT | ✗ | See QuerySettings#logComment and InsertSettings#logComment |
ClickHouseClientOption#MAX_RESULT_ROWS | ✗ | Is server side setting |
ClickHouseClientOption#RESULT_OVERFLOW_MODE | ✗ | Is server side setting |
ClickHouseHttpOption#RECEIVE_QUERY_PROGRESS | ✗ | Server side setting |
ClickHouseHttpOption#WAIT_END_OF_QUERY | ✗ | Server side setting |
ClickHouseHttpOption#REMEMBER_LAST_SET_ROLES | Client#setDBRoles | Runtime config now. See also QuerySettings#setDBRoles and InsertSettings#setDBRoles |
| V1 Configuration | V2 Builder Method | Comments |
|---|---|---|
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 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseDefaults#AUTO_SESSION | ✗ | Session support will be reviewed |
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 | ✗ | Use client 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 | ✗ |
一般的な違い
- Client V2 は移植性を高めるために独自クラスの使用を減らしています。たとえば、V2 はサーバーにデータを書き込むために
java.io.InputStreamの任意の実装と連携します。 - Client V2 の
async設定はデフォルトでoffです。これは、余分なスレッドが作成されず、クライアントの制御をよりアプリケーション側に委ねられることを意味します。この設定は、大半のユースケースでoffのままにしておくべきです。asyncを有効にすると、リクエストごとに別スレッドが作成されます。これは、アプリケーション側で制御する executor を使用する場合にのみ意味があります (com.clickhouse.client.api.Client.Builder#setSharedOperationExecutorを参照)。
データの書き込み
- 任意の
java.io.InputStream実装を使用できます。V1 のcom.clickhouse.data.ClickHouseInputStreamもサポートされていますが、推奨されません。 - 入力ストリームの終端が検出されると、適切に処理されます。以前は、リクエストの出力ストリームをクローズする必要がありました。
V1 TSV形式データの挿入
V2 TSV形式データの挿入
- 呼び出すメソッドは 1 つだけで、別途リクエストオブジェクトを作成する必要はありません。
- リクエストボディストリームは、すべてのデータのコピーが完了すると自動的にクローズされます。
- 新しい低レベル 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はデータへのアクセス手段を提供し、一部の型変換も実装しています。