Druid JDBC驱动:数据库连接方案
【免费下载链接】druid 项目地址: https://gitcode.com/gh_mirrors/dr/druid
在数据处理和分析领域,高效、稳定地连接数据库是至关重要的一环。Druid作为一款高性能的实时分析数据存储系统,提供了多种与外部系统交互的方式,其中JDBC(Java Database Connectivity)驱动是Java应用程序连接Druid的常用且便捷的方案。本文将详细介绍Druid JDBC驱动的使用方法,帮助用户轻松实现与Druid的连接和数据查询。
JDBC驱动概述
Apache Druid支持两种查询语言:Druid SQL和原生查询(Native Queries)。而通过JDBC驱动,我们可以使用Druid SQL进行查询操作。Druid的JDBC功能依赖于Avatica JDBC驱动,官方推荐使用Avatica JDBC驱动版本1.23.0或更高版本。需要注意的是,从Avatica 1.21.0开始,如果遇到间歇性查询失败的情况,可能需要将transparent_reconnection属性设置为true。
一旦下载了Avatica客户端JAR文件,只需将其添加到应用程序的类路径中,即可开始使用JDBC连接Druid。
连接配置
连接字符串
连接Druid的JDBC连接字符串有多种形式,以下是一些常见的示例:
使用JSON协议的连接字符串:
jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica/;transparent_reconnection=true
使用Protobuf协议的连接字符串(相比JSON协议,Protobuf通常能提供更好的性能,尤其对于较大的结果集):
jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica-protobuf/;transparent_reconnection=true;serialization=protobuf
其中,url是Router上的/druid/v2/sql/avatica/端点,它会将JDBC连接路由到一个一致的Broker。关于连接粘性的更多信息,可以参考连接粘性部分。
关键参数
transparent_reconnection:设置为true,这样当Broker池的成员发生变化或Broker重启时,连接不会被中断。serialization:如果使用Protobuf端点,需将此参数设置为protobuf。
连接粘性
Druid的JDBC服务器不会在Broker之间共享连接状态。这意味着如果使用JDBC且有多个Druid Broker,应该要么连接到特定的Broker,要么使用启用了粘性会话的负载均衡器。Druid Router进程在平衡JDBC请求时提供连接粘性,即使使用普通的非粘性负载均衡器,也可以通过Router实现必要的粘性。更多详细信息,请参见Router文档。
需要注意的是,非JDBC的JSON over HTTP API是无状态的,不需要粘性。
代码示例
基本连接与查询
以下是一个使用Java通过JDBC连接Druid并执行查询的基本示例:
// Connect to /druid/v2/sql/avatica/ on your Router.
String url = "jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica/;transparent_reconnection=true";
// Set any connection context parameters you need here.
// Any property from https://druid.apache.org/docs/latest/querying/sql-query-context.html can go here.
Properties connectionProperties = new Properties();
connectionProperties.setProperty("sqlTimeZone", "Etc/UTC");
//To connect to a Druid deployment protected by basic authentication,
//you can incorporate authentication details from https://druid.apache.org/docs/latest/operations/security-overview
connectionProperties.setProperty("user", "admin");
connectionProperties.setProperty("password", "password1");
try (Connection connection = DriverManager.getConnection(url, connectionProperties)) {
try (
final Statement statement = connection.createStatement();
final ResultSet resultSet = statement.executeQuery(query)
) {
while (resultSet.next()) {
// process result set
}
}
}
动态参数
在JDBC代码中可以使用参数化查询,例如:
PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) AS cnt FROM druid.foo WHERE dim1 = ? OR dim1 = ?");
statement.setString(1, "abc");
statement.setString(2, "def");
final ResultSet resultSet = statement.executeQuery();
以下是使用STRING_TO_ARRAY处理数组参数的示例:
PreparedStatement statement = connection.prepareStatement("select l1 from numfoo where SCALAR_IN_ARRAY(l1, STRING_TO_ARRAY(CAST(? as varchar),','))");
List<Integer> li = ImmutableList.of(0, 7);
String sqlArg = Joiner.on(",").join(li);
statement.setString(1, sqlArg);
statement.executeQuery();
使用原生数组的示例:
PreparedStatement statement = connection.prepareStatement("select l1 from numfoo where SCALAR_IN_ARRAY(l1, ?)");
Iterable<Object> list = ImmutableList.of(0, 7);
ArrayFactoryImpl arrayFactoryImpl = new ArrayFactoryImpl(TimeZone.getDefault());
AvaticaType type = ColumnMetaData.scalar(Types.INTEGER, SqlType.INTEGER.name(), Rep.INTEGER);
Array array = arrayFactoryImpl.createArray(type, list);
statement.setArray(1, array);
statement.executeQuery();
完整示例
获取数据源元数据
以下示例展示如何查询INFORMATION_SCHEMA以获取数据源的元数据(如列名):
import java.sql.*;
import java.util.Properties;
public class JdbcListColumns {
public static void main(String[] args)
{
// Connect to /druid/v2/sql/avatica/ on your Router.
// You can connect to a Broker but must configure connection stickiness if you do.
String url = "jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica/;transparent_reconnection=true";
String query = "SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'wikipedia' and TABLE_SCHEMA='druid'";
// Set any connection context parameters you need here.
// Any property from https://druid.apache.org/docs/latest/querying/sql-query-context.html can go here.
Properties connectionProperties = new Properties();
try (Connection connection = DriverManager.getConnection(url, connectionProperties)) {
try (
final Statement statement = connection.createStatement();
final ResultSet rs = statement.executeQuery(query)
) {
while (rs.next()) {
String columnName = rs.getString("COLUMN_NAME");
System.out.println(columnName);
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
查询数据
以下示例查询名为wikipedia的数据源中来自日本的时间戳和评论,并设置查询上下文参数sqlTimeZone:
import java.sql.*;
import java.util.Properties;
public class JdbcCountryAndTime {
public static void main(String[] args)
{
// Connect to /druid/v2/sql/avatica/ on your Router.
// You can connect to a Broker but must configure connection stickiness if you do.
String url = "jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica/;transparent_reconnection=true";
//The query you want to run.
String query = "SELECT __time, isRobot, countryName, comment FROM wikipedia WHERE countryName='Japan'";
// Set any connection context parameters you need here.
// Any property from https://druid.apache.org/docs/latest/querying/sql-query-context.html can go here.
Properties connectionProperties = new Properties();
connectionProperties.setProperty("sqlTimeZone", "America/Los_Angeles");
try (Connection connection = DriverManager.getConnection(url, connectionProperties)) {
try (
final Statement statement = connection.createStatement();
final ResultSet rs = statement.executeQuery(query)
) {
while (rs.next()) {
Timestamp timeStamp = rs.getTimestamp("__time");
String comment = rs.getString("comment");
System.out.println(timeStamp);
System.out.println(comment);
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
元数据获取
通过JDBC可以使用connection.getMetaData()或查询INFORMATION_SCHEMA表来获取表元数据。例如,前面的“获取数据源元数据”示例就展示了如何通过查询INFORMATION_SCHEMA表来获取列名等信息。
总结
Druid JDBC驱动为Java应用程序提供了便捷、高效的连接Druid的方式。通过合理配置连接字符串和参数,结合Avatica JDBC驱动,用户可以轻松实现与Druid的交互,进行数据查询和分析。在实际使用过程中,需要注意连接粘性等特性,以确保连接的稳定性和查询的正常执行。官方文档:docs/api-reference/sql-jdbc.md 中还提供了更多关于Druid JDBC驱动的详细信息,建议用户深入阅读以获取更全面的了解。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



