Druid JDBC驱动:数据库连接方案

Druid JDBC驱动:数据库连接方案

【免费下载链接】druid 【免费下载链接】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驱动的详细信息,建议用户深入阅读以获取更全面的了解。

【免费下载链接】druid 【免费下载链接】druid 项目地址: https://gitcode.com/gh_mirrors/dr/druid

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值