JDBC Driver
clickhouse-jdbc
は、最新のJavaクライアントを使用して標準JDBCインターフェースを実装しています。パフォーマンスや直接アクセスが重要な場合は、最新のJavaクライアントを直接使用することをお勧めします。
0.7.xからの変更
0.8では、ドライバがJDBC仕様をより厳密に遵守するように試みたため、いくつかの機能が削除され、影響を受ける可能性があります:
古い機能 | メモ |
---|---|
トランザクションサポート | ドライバの初期バージョンは、トランザクションサポートをシミュレートしているだけで、予期しない結果を引き起こす可能性がありました。 |
レスポンスカラムのリネーム | ResultSet は変更可能でしたが、効率のために現在は読み取り専用です。 |
マルチステートメントSQL | マルチステートメントサポートはシミュレートされていましたが、現在は厳密に1:1に従います。 |
名前付きパラメータ | JDBC仕様の一部ではありません。 |
ストリームベースのPreparedStatement | ドライバの初期バージョンは、PreparedStatement のJDBC以外での使用を許可していました。そのようなオプションを希望される場合は、Java Clientおよびその例を参照することをお勧めします。 |
Date
はタイムゾーンなしで保存され、DateTime
はタイムゾーン付きで保存されます。注意しないと予期しない結果が生じる可能性があります。
環境要件
- OpenJDK バージョン >= 8
セットアップ
- Maven
- Gradle (Kotlin)
- Gradle
設定
ドライバクラス: com.clickhouse.jdbc.ClickHouseDriver
URL構文: jdbc:(ch|clickhouse)[:<protocol>]://endpoint1[,endpoint2,...][/<database>][?param1=value1¶m2=value2][#tag1,tag2,...]
。例えば:
jdbc:clickhouse:http://localhost:8123
jdbc:clickhouse:https://localhost:8443?ssl=true
接続プロパティ:
標準JDBCプロパティに加えて、ドライバは基盤となるJava Clientが提供するClickHouse特有のプロパティをサポートしています。
可能な限り、メソッドはその機能がサポートされていない場合、SQLFeatureNotSupportedException
を返します。他のカスタムプロパティには次のものが含まれます:
プロパティ | デフォルト | 説明 |
---|---|---|
disable_frameworks_detection | true | User-Agentのためのフレームワーク検出を無効にします |
jdbc_ignore_unsupported_values | false | SQLFeatureNotSupportedException を抑止します |
clickhouse.jdbc.v1 | false | 新しいJDBCの代わりに古いJDBC実装を使用します |
default_query_settings | null | クエリ操作にデフォルトのクエリ設定を渡すことを許可します |
サポートされているデータ型
JDBCドライバは、基盤となるJava Clientと同じデータフォーマットをサポートしています。
日付、時刻、およびタイムゾーンの処理
java.sql.Date
、java.sql.Time
、およびjava.sql.Timestamp
は、タイムゾーンの計算を複雑にする可能性がありますが、もちろんサポートされています。
ZonedDateTime
およびOffsetDateTime
は、java.sql.Timestamp、java.sql.Date、java.sql.Timeの優れた代替品です。
接続の作成
資格情報と設定の提供
シンプルステートメント
挿入
HikariCP
さらなる情報
さらなる情報については、当社のGitHubリポジトリおよびJava Clientのドキュメントを参照してください。
トラブルシューティング
ロギング
ドライバはslf4jを使用してロギングを行い、クラスパス上で最初に利用可能な実装を使用します。
大規模な挿入時のJDBCタイムアウトの解決
ClickHouseで長時間の実行時間を伴う大規模な挿入を行う際に、次のようなJDBCタイムアウトエラーに直面することがあります:
これらのエラーはデータ挿入プロセスを中断し、システムの安定性に影響を与える可能性があります。この問題に対処するには、クライアントのOSでいくつかのタイムアウト設定を調整する必要があります。
Mac OS
Mac OSでは、次の設定を調整して問題を解決できます:
net.inet.tcp.keepidle
: 60000net.inet.tcp.keepintvl
: 45000net.inet.tcp.keepinit
: 45000net.inet.tcp.keepcnt
: 8net.inet.tcp.always_keepalive
: 1
Linux
Linuxでは、同等の設定のみでは問題を解決できない場合があります。Linuxがソケットのキープアライブ設定を処理する方法の違いから、追加の手順が必要です。次の手順に従ってください:
/etc/sysctl.conf
または関連する設定ファイルで次のLinuxカーネルパラメータを調整します:
net.inet.tcp.keepidle
: 60000net.inet.tcp.keepintvl
: 45000net.inet.tcp.keepinit
: 45000net.inet.tcp.keepcnt
: 8net.inet.tcp.always_keepalive
: 1net.ipv4.tcp_keepalive_intvl
: 75net.ipv4.tcp_keepalive_probes
: 9net.ipv4.tcp_keepalive_time
: 60 (デフォルトの300秒からこの値を下げることを考慮することができます)
- カーネルパラメータを変更した後、次のコマンドを実行して変更を適用します:
これらの設定を行った後、クライアントがソケットでKeep Aliveオプションを有効にすることを確認する必要があります: