Apache Doris JDBC 实战指南:连接配置、Spring 工程落地与排障速查
【免费下载链接】dorisApache Doris is an easy-to-use, high performance and unified analytics database.项目地址: https://gitcode.com/gh_mirrors/dori/doris
Java 应用要查 Apache Doris,最短路径就是 JDBC:FE 的查询端口讲 MySQL 协议,配上 MySQL 驱动连上 9030 端口即可读写。下面以仓库里现成的spring-jdbc-demo工程为样本,讲清楚三件事:连接串怎么配、Spring Boot 查询服务怎么搭、连不上或查得慢时从哪里查起。
选型:JDBC 管查询,Stream Load 管写入
先划清边界,能省掉后面很多弯路:
| 场景 | 推荐通道 | 说明 |
|---|---|---|
| 报表接口、交互式查询、小批量更新 | JDBC(MySQL 协议,FE 9030 端口) | 应用侧最通用,本文主题 |
| 大批量数据导入 | Stream Load(HTTP 接口) | 逐行 JDBC INSERT 写入慢且容易产生碎片,仓库有 samples/doris-demo/stream-load-demo/ 可参考 |
| 非 Java 技术栈 | 各语言示例 | samples/connect/ 下提供 Python、Go、Node.js、PHP、C++、Java 六份最小连接样例 |
一句话结论:读走 JDBC,大批量写走 Stream Load,两者不是竞争关系。
JDBC 连接串怎么配:端口、驱动和 URL 参数
连接信息只需要四要素,端口可以直接从 conf/fe.conf 里的query_port = 9030确认:
- host:任一 FE 节点地址;
- port:9030,即 FE 的 query_port,不是 HTTP 端口 8030;
- database:目标库名,跟在 URL 路径里;
- user / password:默认
root,空密码。
最小可运行的 URL 长这样,整串就是"协议 + 地址端口 + 库名 + 编码参数":
jdbc:mysql://fe-host:9030/demo_db?useUnicode=true&characterEncoding=utf8驱动类名按驱动大版本区分:8.x 系列用com.mysql.cj.jdbc.Driver,5.x 系列用com.mysql.jdbc.Driver。驱动和 Doris 大版本的对应关系如下,装错版本一般表现为握手报错或连接直接被拒:
| Doris 版本 | 建议的 MySQL 驱动 |
|---|---|
| 1.0.x | mysql-connector-java 5.1.47 |
| 1.1.x | mysql-connector-java 8.0.26 |
| 1.2.x 及以上 | 8.0.30 及以上;也可用官方org.apache.doris:doris-jdbc(如 1.2.0) |
如果想脱离 Spring 先验证连通性,samples/connect/java/client/src/main/java/client/Client.java 是一个 100 多行的裸DriverManager示例,覆盖建库、建表、插入、查询、删库全流程,跑通它再谈框架。
照着 spring-jdbc-demo 搭一个 Doris 查询服务
完整源码在 samples/doris-demo/spring-jdbc-demo/,配套说明见 samples/doris-demo/spring-jdbc-demo/docs/instructions.md。技术栈是 Spring Boot 2.2.0 + MyBatis 1.3.2 + Druid 1.1.14 + mysql-connector-java 8.0.28。
工程骨架:每个包负责什么
各包的分工,对应上面截图里的目录:
| 包 | 职责 |
|---|---|
config | Druid 数据源构建与 Web 配置 |
datasource | 动态数据源路由(多数据源切换的核心) |
controller | REST 接口,把查询结果以 JSON 吐出去 |
service/mapper | 业务方法与 MyBatis SQL 映射 |
util | Spring 上下文工具类 |
有一个容易踩的坑藏在启动类里:DorisApplication上写了@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。原因是工程自己手搓了 master/slave 两个 Druid 数据源,如果把 Spring Boot 的数据源自动装配也留着,两边会互相打架,启动时要么报冲突、要么连的不是你以为的那个库。凡是自定义数据源,都建议做同样的排除。
动态路由由DynamicDataSource完成,它继承 Spring 的AbstractRoutingDataSource:每次执行 SQL 前回调determineCurrentLookupKey(),从线程上下文里取出当前请求该走哪个数据源,再路由到对应的 master 或 slave 连接池。单数据源场景用不上这套,但"主写从读"或多库切换场景照抄即可。
两个 REST 接口如何把数据查出来
服务起来后,浏览器直接访问两个地址就能看到效果。
第一个是查全量列表,访问localhost:8080/rest/demo/skulist,返回所有商品的 JSON:
调用链很短:DemoController收到请求 →DemoService透传 →DemoMapper(MyBatis 的 XML 映射)执行 SELECT → 结果经 fastjson 序列化输出。
第二个是带路径参数的单条查询,访问/rest/demo/skulist/{skuId},按商品 ID 精确过滤:
注意示例用的表结构和测试数据都来自stream-load-demo(instructions.md里有说明),也就是"Stream Load 写进来,JDBC 查出去",正好对应第一节划的分工。
Druid 连接池参数:哪些值得改,怎么改
连接参数在src/main/resources/application-druid.yml里,示例值是 9030 端口的一个测试库。逐项解释:
| 参数 | 示例值 | 人话解释 |
|---|---|---|
initialSize | 5 | 应用启动时预建的连接数 |
minIdle | 10 | 空闲时至少保留多少条,避免冷启动慢 |
maxActive | 20 | 连接硬上限,超出的请求开始排队 |
maxWait | 60000 | 拿连接最多等 60 秒,再等不下去就报错 |
validationQuery | SELECT 1 FROM DUAL | 探测连接是否还活着的哨兵语句 |
minEvictableIdleTimeMillis | 300000 | 空闲超过 5 分钟的回填回池子 |
slow-sql-millis | 1000 | 超过 1 秒的 SQL 记入慢日志 |
statViewServlet | /druid/* | 打开 Druid Web 控制台看 SQL 统计,需配好账号 |
真正决定吞吐的是maxActive:并发超过它,请求就在maxWait内排队,表现就是接口偶尔卡一下然后超时。调大前先确认 FE 端承受得住,盲目放大只是把压力往后挪。另外建议把log-slow-sql打开,配合慢日志阈值,慢在哪条 SQL 上一目了然。
排障速查:连不上、查得慢、驱动不匹配
| 现象 | 先查什么 |
|---|---|
| 连接超时 / Connection refused | telnet fe-host 9030验证端口;确认连的是 query_port 而不是 8030;检查安全组与防火墙;必要时在 URL 里加socketTimeout拉长等待 |
| Access denied | 账号密码;默认root是空密码,URL 里漏写password=时驱动可能按交互提示卡住 |
| 报驱动类找不到 | Class.forName的类名与驱动大版本不匹配(5.x 与 8.x 的包名不同),对照上面的版本表修正 |
| 接口偶发变慢 | 先怀疑连接池排队:看maxActive与maxWait;再看慢 SQL 日志是否命中大查询 |
| 慢查询稳定复现 | EXPLAIN看执行计划;确认分区条件是否被利用;只 SELECT 需要的列,别整表SELECT * |
| 写入吞吐上不去 | 别再往 JDBC INSERT 上堆并发了,换 Stream Load |
还有一类隐蔽问题:应用连上了但查不到数据,先确认 URL 路径里写的库名,示例工程连的是test_2这类测试库,和生产库不是一个。
下一步:把示例工程跑起来
按下面命令克隆仓库,进入示例目录构建运行,然后浏览器访问localhost:8080/rest/demo/skulist验证(需先改application-druid.yml里的连接信息):
git clone https://gitcode.com/gh_mirrors/dori/doris cd doris/samples/doris-demo/spring-jdbc-demo && mvn spring-boot:run想继续看其他接入方式,从 samples/doris-demo/ 的 README 出发,Flink、Spark、Stream Load 的 demo 都在里面。
【免费下载链接】dorisApache Doris is an easy-to-use, high performance and unified analytics database.项目地址: https://gitcode.com/gh_mirrors/dori/doris
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考