* feat(rocketmq): 优化 RocketMQ 消费者组管理和性能监控 - 添加并行订阅组配置收集功能,支持超时控制和并发限制 - 实现消费者滞后监控功能,支持按主题过滤的滞后统计 - 重构消费滞后结果构建逻辑,添加 Broker 客户端映射功能 - 优化 Admin 客户端构建,确保请求超时参数正确传递 - 为 RabbitMQ 面板组件添加 MQ 写入保护确认机制 - 统一 MQ 面板样式表引入,清理重复按钮样式定义 - 增强连接对话框中的生产环境保护逻辑,支持 MQ 类型范围 - 更新测试用例以验证新的消费者滞后计算和客户端映射功能 - 为 RocketMQ 订阅面板添加过滤计数功能和测试覆盖 * feat(rocketmq): 优化 RocketMQ 客户端连接和消费者组管理 - 移除硬编码的 5 秒收集超时,改用连接配置的请求超时 - 添加从第一个可用主节点收集消费者组配置的方法以提高速度 - 重构内部方法访问客户端 API 实现和超时配置 - 在主题过滤模式下保留一个主节点转储以恢复 FIFO 类型准确性 - 改进消费延迟计算,失败时不设置总延迟而是保持未定义 - 为消费者运行信息获取添加 Docker 地址映射支持 - 更新命名服务器探测逻辑以更好地处理高可用配置 - 增加消息队列保活机制的查询超时支持 - 在前端界面中显示部分积压加载失败的错误信息 - 添加卸载主题前的操作确认保护 - 改进空结果集的用户界面提示信息 * fix(rocketmq): 解决消费组延迟统计失败时显示为健康零延迟的问题 - 在 examineConsumeStatsRemapped 中添加成功计数和最后错误记录 - 添加 ensureConsumeStatsProbeSucceeded 方法确保没有主节点响应时抛出异常 - 修改 TopicConsumeDetail 接口使 delay 字段可选以表示探针失败 - 更新 UI 显示逻辑在延迟不可用时显示破折号而不是零 - 添加测试用例验证所有代理失败时的异常处理 - 在 Rust 代码中检查 totalLag 是否存在以避免将缺失值视为零 - 添加消息队列适配器的标识检查防止过期的保活连接被错误清理 * fix(rocketmq): 修复RocketMQ消费组详情加载和统计查询问题 - 为examineConsumeStats调用添加超时参数以支持Docker地址映射 - 更新ensureConsumeStatsProbeSucceeded方法以处理部分失败情况下的空合并结果 - 在消费者组对话框中添加序列号防止陈旧详情/配置响应覆盖新数据 - 修复消费延迟显示逻辑,将null延迟值显示为"-" - 改进错误处理,确保仅在所有代理成功时才接受空偏移表作为有效结果 * fix(rocketmq): 修复消费者组配置收集和消息积压显示问题 - 修改 collectConsumerGroupConfigsForTopicFilter 方法以合并多个主节点的订阅配置 - 优化 Topic-filtered 列表的配置收集逻辑,确保 FIFO 组类型准确性 - 添加 totalLagFailed 标志以正确处理消息积压探测失败情况 - 更新前端组件以在探测失败时显示 "-" 而非 0 - 修复 Docker 环境下多代理地址映射冲突问题 - 添加 RFC1918 私有 IP 验证方法并改进主机可达性判断 - 为积压不可用状态添加数据模型支持 * fix(rocketmq): 修复RocketMQ消费者组配置收集中的FIFO组识别问题 - 重构订阅组配置合并逻辑,确保FIFO组不会被误识别为NORMAL组 - 添加mergeSubscriptionGroupConfigs方法处理重复和冲突的订阅组配置 - 修改collectConsumerGroupConfigsForTopicFilter方法使用新的合并策略 - 添加测试用例验证FIFO组优先级和后续组保持功能 - 修复中间代理返回重复转储时丢失FIFO-only组的问题 * refactor(rocketmq): 优化消费组统计和名称服务器连接逻辑 - 引入 MasterBrokerAddrPlan 类来管理重映射和冲突回退地址 - 将 examineConsumeStatsRemapped 重构为 examineConsumeStatsOnMasters 方法 - 实现对 Docker 环境中重映射地址的更好支持和故障转移处理 - 在连接前预先探测 NameServer 可达性以避免 JVM 启动超时 - 优化消费者组在线成员数显示,未知状态时显示为 '-' - 添加相关单元测试验证地址解析和冲突处理逻辑 * fix(rocketmq): 修复Docker重映射碰撞和消费者组配置问题 - 修复订阅组配置查找逻辑,支持FIFO合并避免顺序消息被隐藏 - 添加超时参数到订阅组查询方法 - 实现Docker重映射碰撞检测和失败关闭机制 - 添加测试验证碰撞空合并失败关闭逻辑 - 修复RocketMQ跟踪详情对话框加载序列控制问题 - 更新消费延迟标签为积压(backlog) - 添加连接缺失和只读写拒绝的国际化消息提示 - 修复CSS样式中按钮主题颜色应用问题 - 优化NameServer探测预算计算逻辑 * fix(rocketmq): 修复消费者组类型分类和成员计数显示问题 - 当订阅配置缺失时返回 UNKNOWN 类型而不是默认 NORMAL - 在删除和更新消费者组时对所有主节点执行操作确保一致性 - 成员计数查询失败时保持字段为空避免显示错误的离线状态 - 添加 UNKNOWN 类型的国际化支持和UI样式适配 - 修改测试用例验证缺失配置时的类型分类逻辑 * style(mq): 移除MQ面板中的主按钮样式覆盖 - 删除了 .mq-btn-primary 和 .btn-primary 的填充颜色样式定义 - 保留了悬停效果样式以维持用户体验一致性 - 更新注释说明MQ Chrome在浅色主题中保持页面表面样式 - 避免与工具栏和表格操作按钮产生视觉冲突 * test(composables): 为 useMqMutationGuard 添加测试并更新实现 - 添加了测试用例验证MQ面板使用的getter连接ID解析 - 将 unref 替换为 toValue 以正确处理getter参数 - 更新类型导入使用 MaybeRefOrGetter 替代 MaybeRef - 添加注释说明使用 toValue 的原因 * fix(rocketmq): 修复消费者连接检查和订阅组变更的容错机制 - 重构 examineConsumerConnectionInfoRemapped 方法以正确处理无主节点响应的情况 - 添加 requireConsumerConnectionProbeResult 方法确保连接探针结果的准确性 - 修改 mutateSubscriptionGroupOnMasters 方法实现全地址覆盖要求防止部分更新 - 新增 ensureSubscriptionGroupMutationSucceeded 和 shouldFailClosedOnCollisionPartialMutation 方法增强订阅组变更的错误处理 - 更新 rocketmq_subscription_from_group 函数默认类型为 UNKNOWN 而非 NORMAL - 添加多个单元测试验证连接探针和订阅组变更的各种异常场景 * test(rocketmq): 为消费者连接探测测试方法添加异常声明 - 在requireConsumerConnectionProbeResultFailsClosedWhenNoMasterAnswers测试方法中添加throws Exception声明 - 确保测试方法能够正确处理可能抛出的异常情况 * fix(i18n): MQ 生产确认 source 本地化并清理 fieldStatus 死键 --------- Co-authored-by: AiLi <aili@aili.com> Co-authored-by: t8y2 <t8y2@users.noreply.github.com> Co-authored-by: skyler <1156263951@qq.com> |
||
|---|---|---|
| .. | ||
| common | ||
| docs | ||
| drivers | ||
| gradle/wrapper | ||
| scripts | ||
| test-support | ||
| .gitignore | ||
| README.md | ||
| README.zh-CN.md | ||
| build.gradle | ||
| gradlew | ||
| gradlew.bat | ||
| metadata-constraint-coverage.tsv | ||
| settings.gradle | ||
| versions.json | ||
README.md
DBX Agents
English | 简体中文
Agent drivers for DBX — database support via JDBC and native database drivers.
Each agent runs as a standalone process and communicates with DBX via stdin/stdout JSON-RPC 2.0.
Supported Databases
| Agent | Database | Driver |
|---|---|---|
| access | Microsoft Access | UCanAccess |
| dameng | 达梦 DM8 | DM JDBC |
| kingbase | 人大金仓 KingbaseES | gokb Go native agent |
| vastbase | Vastbase | openGauss Go native agent |
| uxdb | UXDB | UXDB JDBC |
| goldendb | GoldenDB | MySQL Connector/J |
| databend | Databend | Databend JDBC |
| databricks | Databricks SQL | Databricks JDBC |
| saphana | SAP HANA | SAP HANA JDBC |
| teradata | Teradata | Teradata JDBC |
| vertica | Vertica | Vertica JDBC |
| firebird | Firebird | Jaybird JDBC |
| exasol | Exasol | Exasol JDBC |
| oceanbase-oracle | OceanBase Oracle Mode | OceanBase JDBC |
| gbase8a | GBase 8a | External GBase 8a JDBC |
| gbase8s | GBase 8s | External GBase 8s JDBC |
| oracle | Oracle 10g+ | go-ora native agent |
| h2 | H2 | H2 JDBC |
| snowflake | Snowflake | Snowflake JDBC |
| trino | Trino (Presto) | Trino JDBC |
| hive | Apache Hive | Hive JDBC |
| db2 | IBM DB2 | DB2 JDBC |
| informix | IBM Informix | Informix JDBC |
| neo4j | Neo4j | Official Neo4j Go Driver native agent |
| cassandra | Apache Cassandra 2.1+ | Apache cassandra-gocql-driver native agent |
| bigquery | Google BigQuery | BigQuery JDBC |
| kylin | Apache Kylin | Kylin JDBC |
| sundb | SunDB | SunDB JDBC |
| tdengine | TDengine 2.4+ | taos-connector-rust native WebSocket agent |
| yashandb | 崖山 YashanDB | YashanDB JDBC |
| xugu | 虚谷 XuguDB | XuguDB Go native agent |
| iotdb | Apache IoTDB | IoTDB JDBC |
| etcd | etcd | jetcd |
| zookeeper | Apache ZooKeeper | Apache Curator |
| rabbitmq | RabbitMQ | amqp091-go native agent |
Multi-JRE Support
Most Java agents target JRE 21. Native agents, such as cassandra, duckdb, oracle, kingbase, tdengine, xugu, and rabbitmq, do not require a JRE. DBX downloads and manages the JRE 21 installation automatically for Java agents.
JDBC Connection Pooling
All multi-session Java JDBC agents share HikariCP pools inside one Agent runtime through AbstractJdbcAgent. Ordinary metadata and short query requests borrow and return a connection, while paged cursors and explicit session-state SQL keep their connection pinned until the cursor or logical session closes. Stateful connections are evicted instead of being reused by another session. Agent-specific URL, transport fallback, encrypted-file, and native-driver behavior is preserved through shared lifecycle hooks.
The default maximum is 8 physical connections per immutable connection identity, with 0 minimum idle connections. This keeps short-query connection pressure bounded while allowing up to 8 concurrently pinned paged cursors or stateful sessions. The defaults can be overridden with JVM system properties or environment variables:
| System property | Environment variable | Default |
|---|---|---|
dbx.agent.jdbc.pool.enabled |
DBX_AGENT_JDBC_POOL_ENABLED |
true |
dbx.agent.jdbc.pool.maximumPoolSize |
DBX_AGENT_JDBC_POOL_MAXIMUM_POOL_SIZE |
8 |
dbx.agent.jdbc.pool.minimumIdle |
DBX_AGENT_JDBC_POOL_MINIMUM_IDLE |
0 |
dbx.agent.jdbc.pool.connectionTimeoutMillis |
DBX_AGENT_JDBC_POOL_CONNECTION_TIMEOUT_MILLIS |
30000 |
dbx.agent.jdbc.pool.validationTimeoutMillis |
DBX_AGENT_JDBC_POOL_VALIDATION_TIMEOUT_MILLIS |
5000 |
dbx.agent.jdbc.pool.idleTimeoutMillis |
DBX_AGENT_JDBC_POOL_IDLE_TIMEOUT_MILLIS |
120000 |
dbx.agent.jdbc.pool.maxLifetimeMillis |
DBX_AGENT_JDBC_POOL_MAX_LIFETIME_MILLIS |
1800000 |
dbx.agent.jdbc.pool.retireMillis |
DBX_AGENT_JDBC_POOL_RETIRE_MILLIS |
300000 |
HikariCP is shaded into each pooled Agent JAR. Existing installations already using the managed JRE 21 do not need to reinstall or replace the JRE.
Set DBX_AGENT_JDBC_POOL_ENABLED=false for a runtime-level compatibility fallback to the previous one-connection-per-logical-session behavior.
Choosing a Driver Language
For new agents, prefer a native (Go or Rust) driver over a Java/JDBC agent whenever a mature, license-compatible native driver is available. Native agents ship as a single self-contained executable with no JRE, which significantly reduces memory footprint and startup time — the JVM baseline that every Java agent pays even when idle is avoided entirely.
- Native (C++/Go/Rust) — preferred when a usable native driver exists. See
drivers/cassandra-go(Apache cassandra-gocql-driver),drivers/duckdb,drivers/oracle-go(go-ora),drivers/kingbase-go(gokb),drivers/vastbase-go(openGauss connector),drivers/tdengine(taos-connector-rust),drivers/xugu, anddrivers/rabbitmq(amqp091-go) as reference implementations. No JRE download or management is needed. - Java/JDBC — the default fallback when only a JDBC driver exists for the database, or when the native driver is immature or unmaintained. Most agents still fall in this category.
Native agents implement the same JSON-RPC contract and versions.json registration as Java agents; they ship an agent executable instead of agent.jar. If both native and Java source implementations exist for the same database, publish only the native artifact unless the Java variant has a separately registered compatibility profile, such as oracle-legacy / oracle-10g.
Build
Requires JDK 21 (Gradle toolchain auto-downloads if needed).
./gradlew shadowJar
(cd drivers/oracle-go && go build -o agent .)
(cd drivers/cassandra-go && go build -o agent .)
(cd drivers/kingbase-go && go build -o agent .)
(cd drivers/vastbase-go && go build -o agent .)
(cargo build --manifest-path drivers/tdengine/Cargo.toml --release --locked)
(cd drivers/xugu && go build -o agent .)
(cd drivers/rabbitmq && go build -o agent .)
Output JARs are in drivers/{module}/build/libs/. Native agents build from drivers/cassandra-go, drivers/oracle-go, drivers/kingbase-go, drivers/vastbase-go, drivers/tdengine, drivers/xugu, and drivers/rabbitmq.
Local DBX Runtime Test
When changing a Java agent under agents/drivers/<db_type>/ or shared Java agent protocol code, rebuild the target agent and replace the runtime JAR used by the local DBX app:
./gradlew :<db_type>:shadowJar
cp ~/.dbx/agents/drivers/<db_type>/agent.jar ~/.dbx/agents/drivers/<db_type>/agent.jar.bak
cp agents/drivers/<db_type>/build/libs/*-all.jar ~/.dbx/agents/drivers/<db_type>/agent.jar
Restart DBX or disconnect and reconnect the database so the new agent process loads the replacement JAR.
Native agents such as cassandra, oracle, kingbase, tdengine, xugu, and rabbitmq use an agent executable instead of agent.jar. TDengine builds target/release/dbx-tdengine-driver from drivers/tdengine/Cargo.toml.
Versioning
Agent module versions are tracked in versions.json.
- Changing an existing driver — do not edit
versions.jsonmanually. The release CI diffs eachdrivers/<module>/directory against the previous tag and auto-bumps the patch version for every changed module (seebump-agent-versions.mjs). A change to the sharedagents/commonruntime bumps every module that packages it. - Adding a new driver — add an entry to
versions.json, e.g."rabbitmq": "0.1.0". The CI only bumps keys already present in the file, so a new module is invisible to versioning until it is registered here. Java modules must also be added tosettings.gradle; native modules must be registered in the release version script and workflow. Update the support table in the same change.
Development
- Agent authoring guide: docs/agent-authoring.md
- JDBC agent template: docs/examples/jdbc-agent-template
- Release checklist: docs/release-checklist.md
Architecture
DBX Main Process (Rust/Tauri)
│ stdin/stdout (JSON-RPC 2.0)
▼
agent / java -jar dbx-agent-{type}.jar
│
▼
Native driver / JDBC → Database