DBサーバーとそのプロトコルを通じて通信するための Java クライアントライブラリです。現在の実装は HTTP インターフェイス のみをサポートしています。
このライブラリはサーバーへリクエストを送信するための独自の API を提供します。また、さまざまなバイナリデータフォーマット (RowBinary* & Native*) を扱うためのツールも提供しています。
アクセストークンによる認証を行うには、SSLクライアント証明書による認証を行うには、
結果として、アプリケーションは、自身を識別するために独自の HTTP ヘッダー ⚠️ パラメーターパラメーターパラメーターパラメーターパラメーターパラメーターパラメーターパラメーターV2でTSVフォーマットのデータを挿入する。
セットアップ
- Maven Central (プロジェクトのWebページ) : https://mvnrepository.com/artifact/com.clickhouse/client-v2
- ナイトリービルド (リポジトリへのリンク) : https://central.sonatype.com/repository/maven-snapshots/
- 旧 Nightly build の artifactory (リポジトリへのリンク) : https://s01.oss.sonatype.org/content/repositories/snapshots/
- Maven
- Gradle (Kotlin)
- Gradle
初期化
Client オブジェクトはcom.clickhouse.client.api.Client.Builder#build() によって初期化されます。各クライアントは独自のコンテキストを持ち、クライアント間でオブジェクトが共有されることはありません。
Builder には、便利な設定メソッドが用意されています。例:showLineNumbers
Client は AutoCloseable であり、不要になったらクローズしてください。認証
認証は初期化時にクライアントごとに設定します。サポートされている認証方式は 3 つあります。パスワード、アクセストークン、SSL クライアント証明書です。パスワードによる認証を行うには、setUsername(String) および setPassword(String) を呼び出してユーザー名とパスワードを設定する必要があります。showLineNumbers
setAccessToken(String) を呼び出してアクセストークンを設定する必要があります。showLineNumbers
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"]}のような内容が出力されます)
- ユーザー証明書から CN を取得する -
設定
すべての設定は、各値のスコープとコンテキストが明確になるように、インスタンスメソッド (別名: 設定メソッド) で定義されています。 主要な設定パラメーターは単一のスコープ (クライアントまたは操作) で定義され、互いに上書きされることはありません。設定はクライアントの作成時に定義されます。com.clickhouse.client.api.Client.Builder を参照してください。クライアント設定
- 接続 & エンドポイント
- 認証
- タイムアウトと再試行
- ソケットオプション
- 圧縮
- SSL/セキュリティ
- プロキシ
- HTTP とヘッダー
- サーバー設定
- タイムゾーン
- 上級
クライアントの識別
クエリログには、リクエストの送信元アプリケーションを識別する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 メソッドで設定された値がリストの先頭に配置されます。例:showLineNumbers
http_user_agent の値は次のようになります。User-Agent を設定できます。ただし、clickhouse-java-v2/0.9.6-SNAPSHOT という文字列がヘッダーの末尾に追加されます。オペレーションの識別
クエリログには、操作の識別やクエリログへの追加情報の付加に使用できるquery_id と log_comment という2つのフィールドがあります。query_id は操作の一意の識別子です。アプリケーションは QuerySettings クラスの setQueryId メソッドを呼び出して設定できます。showLineNumbers
log_comment は、クエリログに追加できるコメントです。アプリケーションから QuerySettings クラスの logComment メソッドを呼び出して設定できます。showLineNumbers
サーバー設定
サーバー側の設定は、クライアントレベルでは作成時に一度設定できます (Builder の serverSetting メソッドを参照) 。また、オペレーションレベルでも設定できます (オペレーション設定クラスの 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 として受け取ります。data は format でエンコードされていることが前提です。シグネチャ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
クエリ実行の結果を保持するレスポンスオブジェクトです。クライアントがサーバーからレスポンスを受け取った場合にのみ使用できます。前のレスポンスのデータをすべて完全に読み取るまで、その接続は再利用できないため、接続を解放するにはこのオブジェクトをできるだけ早く閉じる必要があります。
例
共通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 値を含む配列やネストされた配列を読み取る際に使用します。
GenericRecord メソッドgetList(...)- 任意のArray(...)をList<T>として読み取ります。柔軟な型付き読み取りの標準的な選択肢です。ネストした配列にも対応しています。getByteArray(...),getShortArray(...),getIntArray(...),getLongArray(...),getFloatArray(...),getDoubleArray(...),getBooleanArray(...)- プリミティブ互換の値で構成される1次元配列に最適です。getStringArray(...)-Array(String)用 (および名前で表される enum の値) 。getObjectArray(...)- ネストされた配列を含む、あらゆるArray(...)の要素型に対応する汎用オプションです。Nullable な値を含む配列や、ネストされた配列を読み取る際に使用します。
移行ガイド
旧クライアント (V1) ではcom.clickhouse.client.ClickHouseClient#builderを起点として使用していました。新クライアント (V2) ではcom.clickhouse.client.api.Client.Builderを用いた同様のパターンを採用しています。主な相違点は以下のとおりです:- 実装の取得に service loader は使用されません。
com.clickhouse.client.api.Clientは、将来的にさまざまな実装に対応するためのファサードクラスです。 - 設定の定義元が少なくなりました。1 つはビルダーに渡され、もう 1 つは操作設定 (
QuerySettings、InsertSettings) にあります。以前のバージョンではノードごとの設定があり、場合によっては 環境変数を読み込んでいました。
設定パラメータの一致
V1にはconfigurationに関連するenumクラスが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 をすべてのクライアント設定オプションを網羅する単一の Dictionary として使用します。また、すべての設定パラメータ名が列挙された
com.clickhouse.client.api.ClientConfigProperties も用意されています。以下の表に、新しいクライアントでサポートされている旧オプションとその新しい意味を示します。凡例: ✔ = サポート対象、✗ = 非対応- 接続 & 認証
- SSL & セキュリティ
- ソケットオプション
- 圧縮
- プロキシ
- タイムアウトと再試行
- タイムゾーン
- バッファとパフォーマンス
- スレッド & 非同期
- HTTP & ヘッダー
- フォーマット & クエリ
- ノードディスカバリ & ロードバランシング
- その他
主な相違点
- 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もサポートされていますが、推奨はされていません。- 入力ストリームの終端が検出されると、それに応じて処理されます。従来は、リクエストの出力ストリームを閉じる必要がありました。
- 呼び出すメソッドは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を使うとデータにアクセスでき、いくつかの変換も行えます。