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

セットアップ



初期化

Client オブジェクトは com.clickhouse.client.api.Client.Builder#build() によって初期化されます。各クライアントは独自のコンテキストを持ち、クライアント間でオブジェクトが共有されることはありません。 Builder には、便利な設定メソッドが用意されています。例:
showLineNumbers
ClientAutoCloseable であり、不要になったらクローズしてください。

認証

認証は初期化時にクライアントごとに設定します。サポートされている認証方式は 3 つあります。パスワード、アクセストークン、SSL クライアント証明書です。パスワードによる認証を行うには、setUsername(String) および setPassword(String) を呼び出してユーザー名とパスワードを設定する必要があります。
showLineNumbers
アクセストークンによる認証を行うには、setAccessToken(String) を呼び出してアクセストークンを設定する必要があります。
showLineNumbers
SSLクライアント証明書による認証を行うには、setUsername(String)useSSLAuthentication(boolean)setClientCertificate(String)、および setClientKey(String) をそれぞれ呼び出して、ユーザー名の設定、SSL認証の有効化、クライアント証明書とクライアント秘密鍵の設定を行う必要があります。
showLineNumbers
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"]} のような内容が出力されます)

設定

すべての設定は、各値のスコープとコンテキストが明確になるように、インスタンスメソッド (別名: 設定メソッド) で定義されています。 主要な設定パラメーターは単一のスコープ (クライアントまたは操作) で定義され、互いに上書きされることはありません。設定はクライアントの作成時に定義されます。com.clickhouse.client.api.Client.Builder を参照してください。

クライアント設定


クライアントの識別

クエリログには、リクエストの送信元アプリケーションを識別する2つのフィールドがあります: client_namehttp_user_agent です。ネイティブTCPプロトコルはアプリケーションの識別に client_name を使用し、HTTPプロトコルは http_user_agent を使用します。クライアントビルダーには、両プロトコルに対して正しい値を設定するメソッド setClientName があります。 フィールド http_user_agent は、User-Agent ヘッダーの一般的なフォーマットに従って設定されます: application-name[/version] [(operating-system; architecture; ...)]。 この値のセットは、アプリケーション、クライアントライブラリ、HTTPクライアントライブラリという各レイヤーに対して繰り返されます。setClientName メソッドで設定された値がリストの先頭に配置されます。例:
showLineNumbers
結果として、http_user_agent の値は次のようになります。
アプリケーションは、自身を識別するために独自の HTTP ヘッダー User-Agent を設定できます。ただし、clickhouse-java-v2/0.9.6-SNAPSHOT という文字列がヘッダーの末尾に追加されます。

オペレーションの識別

クエリログには、操作の識別やクエリログへの追加情報の付加に使用できる query_idlog_comment という2つのフィールドがあります。query_id は操作の一意の識別子です。アプリケーションは QuerySettings クラスの setQueryId メソッドを呼び出して設定できます。
showLineNumbers
log_comment は、クエリログに追加できるコメントです。アプリケーションから QuerySettings クラスの logComment メソッドを呼び出して設定できます。
showLineNumbers

サーバー設定

サーバー側の設定は、クライアントレベルでは作成時に一度設定できます (BuilderserverSetting メソッドを参照) 。また、オペレーションレベルでも設定できます (オペレーション設定クラスの serverSetting を参照) 。
showLineNumbers
⚠️ setOption メソッド (Client.Builder または操作設定クラス) でオプションを設定する場合、サーバー設定名には clickhouse_setting_ というプレフィックスを付ける必要があります。この場合、com.clickhouse.client.api.ClientConfigProperties#serverSetting() を使用すると便利です。

カスタム HTTP ヘッダー

カスタムHTTP headersは、すべての操作 (クライアントレベル) または個別の操作 (オペレーションレベル) に設定できます。
showLineNumbers
setOption メソッド (Client.Builder または操作設定クラス) でオプションを設定する場合、カスタムヘッダー名には http_header_ をプレフィックスとして付ける必要があります。この場合、com.clickhouse.client.api.ClientConfigProperties#httpHeader() メソッドが便利です。

共通の定義

ClickHouseFormat

対応フォーマットのenumです。ClickHouseがサポートするすべてのフォーマットを含みます。
  • raw - ユーザーは生データをトランスコードする必要があります
  • full - クライアント自身でデータをトランスコードでき、raw データストリームを受け入れます
  • - - このフォーマットでは、ClickHouse はこの操作をサポートしていません
このクライアント バージョンでは以下をサポートしています:

Insert API

insert(String tableName, InputStream data, ClickHouseFormat format)

指定されたフォーマットのバイト列を InputStream として受け取ります。dataformat でエンコードされていることが前提です。シグネチャ
パラメーターtableName - ターゲットテーブルの名前。data - エンコードされたデータの入力ストリーム。format - データのエンコード形式を指定するフォーマット。settings - リクエストの設定。戻り値InsertResponse 型のFuture — 操作の結果およびサーバーサイドのメトリクスなどの追加情報。
showLineNumbers

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

データベースへ書き込みリクエストを送信します。オブジェクトのリストは効率的なフォーマットに変換され、サーバーに送信されます。リスト要素のクラスは、register(Class, TableSchema) メソッドを使用して事前に登録しておく必要があります。シグネチャ
パラメーターtableName - ターゲットテーブルの名前。data - コレクションDTO (Data Transfer Object) オブジェクト。settings - リクエストの設定。戻り値InsertResponse 型のFuture — 操作の結果およびサーバーサイドのメトリクスなどの追加情報。
showLineNumbers

InsertSettings

挿入操作の設定オプション。設定方法

InsertResponse

insertオペレーションの結果を保持するレスポンスオブジェクトです。クライアントがサーバーからレスポンスを受け取った場合にのみ使用できます。
このオブジェクトは、以前のレスポンスのデータをすべて完全に読み取るまで接続を再利用できないため、接続を解放するにはできるだけ早く閉じてください。

クエリ API

query(String sqlQuery)

sqlQuery をそのまま送信します。レスポンスのフォーマットはクエリの設定によって決まります。QueryResponse はレスポンスストリームへの参照を保持し、対応するフォーマットのリーダーによって読み取られる必要があります。シグネチャ
パラメーターsqlQuery - 単一のSQLステートメント。クエリはそのままサーバーに送信されます。settings - リクエストの設定。戻り値QueryResponse 型の将来のあり方 — 結果データセットとサーバー側メトリクスのような追加情報を含みます。データセットを消費した後は Response オブジェクトを閉じる必要があります。

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

sqlQuery をそのまま送信します。また、サーバーがSQL式をコンパイルできるように、クエリパラメータも送信します。シグネチャ
パラメーターsqlQuery - プレースホルダー {} を含むSQLエクスプレッション。queryParams - サーバー上で SQL 式を完成させるための変数を格納するマップ。settings - リクエストの設定。戻り値QueryResponse 型のFuture — 結果データセットおよびサーバーサイドのメトリクスなどの追加情報を含みます。Responseオブジェクトは、データセットを使用した後にクローズする必要があります。
showLineNumbers

queryAll(String sqlQuery)

RowBinaryWithNamesAndTypes フォーマットでデータをクエリします。結果をコレクションとして返します。読み取りパフォーマンスはリーダーと同等ですが、データセット全体を保持するためにより多くのメモリが必要になります。署名
パラメーターsqlQuery - サーバーからデータをクエリするためのSQL式。戻り値結果データに行形式でアクセスできる GenericRecord オブジェクトのリストで表される、完全なデータセット。
showLineNumbers

QuerySettings

クエリ操作の設定オプション。設定方法

QueryResponse

クエリ実行の結果を保持するレスポンスオブジェクトです。クライアントがサーバーからレスポンスを受け取った場合にのみ使用できます。
前のレスポンスのデータをすべて完全に読み取るまで、その接続は再利用できないため、接続を解放するにはこのオブジェクトをできるだけ早く閉じる必要があります。

  • サンプルコードはリポジトリで公開されています
  • Spring Service のリファレンス 実装

共通API

getTableSchema(String table)

table のテーブルスキーマを取得します。署名
パラメーターtable - スキーマデータを取得する対象のテーブル名。database - ターゲットテーブルが定義されているデータベース。戻り値テーブルのカラム一覧を含む TableSchema オブジェクトを返します。

getTableSchemaFromQuery(String sql)

SQLステートメントからスキーマを取得します。シグネチャ
パラメーターsql - スキーマが返される “SELECT” SQL 文。戻り値sql 式に対応するカラムを含む TableSchema オブジェクトを返します。

TableSchema

register(Class<?> clazz, TableSchema schema)

schema を使用してデータの書き込み・読み込みを行う Java クラス向けに、シリアライゼーションおよびデシリアライゼーションのレイヤーをコンパイルします。このメソッドは、getter/setter のペアと対応するカラムに対して、シリアライザーとデシリアライザーを生成します。 カラムの照合は、メソッド名からカラム名を抽出することで行われます。たとえば、getFirstName はカラム first_name または firstname に対応します。シグネチャ
パラメーターclazz - データの読み書きに使用するPOJOを表すクラス。schema - POJOプロパティとの照合に使用するデータスキーマ。
showLineNumbers

使用例

完全なサンプルコードは、リポジトリの ‘example` フォルダ に保存されています:
  • client-v2 - 主なサンプル一式。
  • demo-service - Spring Boot アプリケーションでクライアントを使用する方法を示す例。
  • demo-kotlin-service - Ktor (Kotlin) アプリケーションでクライアントを使用する方法を示す例。

データの読み取り

データを読み取る一般的な方法は2つあります。
  • データを含む InputStream を持つ低レベルの QueryResponse オブジェクトを返す query() メソッド。通常はストリーミング読み取りのために 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(...) - プリミティブ型と互換性のある値の1次元配列に最適です。
  • getStringArray(...) - Array(String) 用 (および名前で表される enum 値) 。
  • getObjectArray(...) - ネストされた配列を含む、任意の Array(...) 要素型に対応する汎用オプションです。NULL 値を含む配列やネストされた配列を読み取る際に使用します。
すべてのメソッドに対して、索引ベースおよび名前ベースのオーバーロードが利用可能です。索引は1始まりです。索引ベースはカラムへ直接アクセスします。 名前ベースのメソッドは、呼び出しのたびに索引のルックアップが必要です。
GenericRecord メソッド
  • getList(...) - 任意の Array(...)List<T> として読み取ります。柔軟な型付き読み取りの標準的な選択肢です。ネストした配列にも対応しています。
  • getByteArray(...), getShortArray(...), getIntArray(...), getLongArray(...), getFloatArray(...), getDoubleArray(...), getBooleanArray(...) - プリミティブ互換の値で構成される1次元配列に最適です。
  • getStringArray(...) - Array(String) 用 (および名前で表される enum の値) 。
  • getObjectArray(...) - ネストされた配列を含む、あらゆる Array(...) の要素型に対応する汎用オプションです。Nullable な値を含む配列や、ネストされた配列を読み取る際に使用します。
すべてのメソッドで、インデックスベースと名前ベースのオーバーロードが利用できます。インデックスは1始まりです。インデックスベースではカラムへ直接アクセスできます。 名前ベースのメソッドでは、毎回インデックスの検索が必要です。

移行ガイド

旧クライアント (V1) ではcom.clickhouse.client.ClickHouseClient#builderを起点として使用していました。新クライアント (V2) ではcom.clickhouse.client.api.Client.Builderを用いた同様のパターンを採用しています。主な相違点は以下のとおりです:
  • 実装の取得に service loader は使用されません。com.clickhouse.client.api.Client は、将来的にさまざまな実装に対応するためのファサードクラスです。
  • 設定の定義元が少なくなりました。1 つはビルダーに渡され、もう 1 つは操作設定 (QuerySettingsInsertSettings) にあります。以前のバージョンではノードごとの設定があり、場合によっては 環境変数を読み込んでいました。

設定パラメータの一致

V1にはconfigurationに関連するenumクラスが3つあります:
  • com.clickhouse.client.config.ClickHouseDefaults - ほとんどのユースケースで設定しておくことが想定される設定パラメータです。USERPASSWORD などが該当します。
  • com.clickhouse.client.config.ClickHouseClientOption - クライアント固有の設定パラメータです。HEALTH_CHECK_INTERVAL などが該当します。
  • com.clickhouse.client.http.config.ClickHouseHttpOption - HTTPインターフェイス固有の設定パラメータです。RECEIVE_QUERY_PROGRESS などがあります。
これらはパラメータをグループ化し、明確に分離するために設計されました。しかし、場合によっては混乱を招くことがありました (com.clickhouse.client.config.ClickHouseDefaults#ASYNCcom.clickhouse.client.config.ClickHouseClientOption#ASYNC に違いはあるのか、など) 。新しい V2 クライアントでは、com.clickhouse.client.api.Client.Builder をすべてのクライアント設定オプションを網羅する単一の Dictionary として使用します。また、すべての設定パラメータ名が列挙された com.clickhouse.client.api.ClientConfigProperties も用意されています。以下の表に、新しいクライアントでサポートされている旧オプションとその新しい意味を示します。凡例: ✔ = サポート対象、✗ = 非対応

主な相違点

  • 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)メソッドを使用して、レコードのコレクションとして読み取ることができます。これにより、データはメモリに読み込まれ、connection は解放されます。追加の処理は必要ありません。GenericRecordを使うとデータにアクセスでき、いくつかの変換も行えます。
最終更新日 2026年6月19日