Druid.io系列(五):查询过程

本文介绍了Druid查询系统,包括支持的查询类型如聚合查询、时间序列查询等,并详细解释了带有过滤条件的查询如何高效地利用位图索引进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Druid使用JSON over HTTP 作为底层的查询语言,不过强大的社区也为我们提供了多种查询方式,比如Python接口pydruid、R接口RDruid、JavaScript接口plywood、类SQL接口plyql、PHP接口druid-php等。

Druid查询目前只支持单表操作,基本涵盖了ANSISQL中常用的查询语句,包括:

聚合类(Aggregation)查询
时间序列查询
TopN查询
GroupBy

元信息(Metadata)类查询
时间范围查询(数据集最早和最近出现时间点)
Segment元信息
DataSource元信息

搜索类(Search)查询(包括Select查询)
不过Druid目前还不支持JOIN类操作,以上已支持的各类查询的详细说明可以参见:http://druid.io/docs/0.9.1.1/querying/searchquery.html

查询过程
在介绍BrokerNode中已基本概述了Druid是如何查询集群内的数据。BrokerNode作为集群内查询入口,需要了解数据在集群内的分布情况,才能将查询请求发送给对应的数据节点(包括HistoricalNode和Real-TimeNode),BrokerNode会merge每个节点返回的数据,最终返回给用户。

在这里主要说下带有过滤(filter)的查询请求,我们知道Segments内部存在位图索引,所以数据的过滤操作完全可以转换为bitmap的按位逻辑操作,所以无论是HistoricalNodes还是Real-TimeNodes,都不需要去查看原始数据,只需要通过位图索引的按位逻辑操作,获得符合过滤条件的行号,再取出需要的列返回给Broker即可。

<think>好的,我现在需要帮助用户解决他们遇到的Druid连接池初始化错误的问题。用户提供的错误信息是“illegal initialSize 100, maxActive 8”,这个错误发生在初始化DruidDataSource的时候。首先,我需要理解这个错误的具体原因。 根据错误信息,IllegalArgumentException被抛出,说明在初始化参数时有不合法的值。错误提示指出initialSize是100,而maxActive是8。Druid连接池的参数配置有某些约束条件,这里的问题可能是initialSize(初始连接数)超过了maxActive(最大活跃连接数)。通常来说,初始连接数不能超过最大连接数,否则会导致资源分配不合理,甚至引发错误。 接下来,我需要回忆Druid连接池的相关配置参数。Druid的initialSize默认值通常是0,maxActive默认是8。如果用户将initialSize设置为100,而maxActive保持默认的8,这显然会导致initialSize > maxActive,从而触发异常。 那么,用户可能的配置文件中设置了initialSize为100,但没有调整maxActive的值。需要检查他们的配置文件,比如application.yml或application.properties,查看这两个参数的设置情况。 解决方案应该是调整这两个参数,使得initialSize不超过maxActive。例如,将maxActive增加到至少100或更高,或者将initialSize降低到8或以下。另外,还需要考虑其他相关参数,比如minIdle(最小空闲连接数),是否也需要调整以保证一致性。 此外,用户可能没有意识到这些参数之间的依赖关系,或者是在配置时出现了笔误。需要建议他们检查配置文件中的相关部分,特别是druid的连接池配置部分,确认参数是否合理。 同时,还需要提醒用户,连接池参数的设置需要根据实际应用的需求和数据库的处理能力来调整。过高的initialSize可能会在启动时给数据库带来压力,而maxActive设置过高可能导致资源耗尽。因此,建议他们根据实际情况进行测试和优化。 最后,可能需要提供一个完整的配置示例,帮助用户正确设置这些参数,并解释每个参数的作用,以避免未来的配置错误。</think>--- ### **错误原因分析** 根据报错信息 `illegal initialSize 100, maxActive 8`,说明 **Druid 连接池**的配置存在以下矛盾: 1. `initialSize`(初始连接数)设置为 `100`,但 `maxActive`(最大活跃连接数)设置为 `8`。 2. **Druid 要求**:初始连接数 `initialSize` 必须小于等于 `maxActive`,否则会抛出此异常。 --- ### **解决方案** #### **1. 调整连接池参数** 修改 `application.yml`(或 `application.properties`)中 Druid 的配置,确保 `initialSize ≤ maxActive`。 示例如下: ```yaml type: druid driverClass: dm.jdbc.driver.DmDriver url: jdbc:dm://172.16.1.30:5236/orcl?clobAsString=1&quoteReplace=1 username: heal-dm password: heal-dm@130301 # 新增连接池参数配置 initialSize: 5 # 初始连接数(建议 ≤ maxActive) maxActive: 20 # 最大活跃连接数(必须 ≥ initialSize) minIdle: 3 # 最小空闲连接数(建议 ≤ maxActive) ``` --- #### **2. 参数说明** | 参数名 | 含义 | 默认值 | 建议值范围 | |--------------|---------------------|--------|------------------| | `initialSize`| 启动时创建的连接数 | 0 | 根据负载设定,建议 `≤ maxActive` | | `maxActive` | 最大活跃连接数 | 8 | 根据数据库承载能力调整(如 `20~100`) | | `minIdle` | 最小空闲连接数 | 0 | 建议 `≤ maxActive` | --- ### **注意事项** 1. **参数合理性**: - `initialSize` 过高可能导致应用启动时数据库压力骤增。 - `maxActive` 需根据数据库连接上限调整(例如达梦默认连接数限制为 `1000`)。 2. **其他关联参数**: - `maxWait`:获取连接的超时时间(默认 `-1`,建议 `3000ms`)。 - `testOnBorrow`:是否在获取连接时检测有效性(默认 `false`,生产环境建议开启)。 --- ### **完整配置示例** ```yaml type: druid driverClass: dm.jdbc.driver.DmDriver url: jdbc:dm://172.16.1.30:5236/orcl?clobAsString=1&quoteReplace=1 username: heal-dm password: heal-dm@130301 # 连接池参数 initialSize: 5 maxActive: 20 minIdle: 3 maxWait: 3000 testOnBorrow: true validationQuery: SELECT 1 FROM DUAL ``` --- ### **验证方法** 1. 启动应用,观察是否仍然报错。 2. 通过 Druid 监控页面(如已启用)检查连接池状态,确认参数生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值