针对 OceanBase 和 GreatSQL 这两款内核架构迥异的数据库(前者是原生分布式,后者是单机增强版 MySQL),Java 应用的调优策略也分化为“分布式协调”与“单机压榨”两条路线。结合你在郑州的政务云/金融开发场景,以下是 2026 年最新的实战调优指南。
一、OceanBase:面向分布式架构的 Java 调优
OceanBase 的瓶颈往往不在单机计算,而在网络开销和分布式事务协调。调优核心是“减少 RPC 次数,利用好路由代理”。
1. JDBC 连接与 SQL 执行层(关键)
驱动选择:优先使用 OceanBase 官方 JDBC 驱动(oceanbase-client)或高版本 MySQL Connector/J(8.0.x),确保支持 OceanBase 特有的超时和路由参数。
连接字符串(URL)核心参数:
# Spring Boot 配置示例(连接 OBProxy) url: jdbc:oceanbase://obproxy-host:2883/my_tenant?useUnicode=true&characterEncoding=utf8 &rewriteBatchedStatements=true # 【强制】合并批量操作,减少RPC &allowMultiQueries=true # 允许批量 DML &useCursorFetch=true # 大结果集使用游标,防止 OOM &useLocalSessionState=true # 减少会话状态检查 &connectTimeout=3000 # 建连超时(ms) &socketTimeout=60000 # 单次 SQL 执行超时 &sessionVariables=ob_read_consistency=WEAK # 只读查询走弱一致性(读从副本)代码层优化:
批量操作:必须使用
addBatch()并开启rewriteBatchedStatements,否则分布式下的单条 INSERT 性能极差。大结果集:使用
setFetchSize(1000)或Integer.MIN_VALUE(流式)分批拉取,避免一次加载海量数据到 JVM 内存。
2. 连接池配置(HikariCP/Druid)
OceanBase 的连接建立成本较高(需路由到正确的 OBServer),建议避免频繁创建销毁。
# HikariCP 推荐配置 maximumPoolSize: 20 # 不宜过大,OBProxy 会复用后端连接 minimumIdle: 5 idleTimeout: 600000 # 10分钟,保持长连接 maxLifetime: 1800000 # 30分钟,OB 长连接稳定性好 connectionTimeout: 3000 validationTimeout: 1000 leakDetectionThreshold: 600003. 应用层设计(读写分离与事务控制)
读写分离:在 JDBC URL 中通过
sessionVariables=ob_read_consistency=WEAK强制只读查询走从副本,显著降低主副本压力。对于报表类查询,可指定/*+READ_CONSISTENCY(WEAK)*/Hint。事务精简:OceanBase 的分布式事务成本高,严禁在事务内执行无关的查询(如查询序列号、查询配置等),尽量将事务粒度降到最低。
4. 服务端配合(租户资源规划)
Java 应用调优需与 DBA 配合:
Unit 配置:确保租户的
MAX_CPU和MEMORY_SIZE充足,避免因资源超卖导致 Java 应用报超时。SQL 限流:利用 OceanBase 的
OUTLINE功能对慢 SQL 进行自动限流或改写,防止一条烂 SQL 拖垮整个集群。
二、GreatSQL:面向单机极致的 Java 调优
GreatSQL 的调优逻辑与 MySQL 一脉相承,核心是“降低锁竞争,利用好线程池与并行能力”。
1. 服务端关键配置(my.cnf)
GreatSQL 的杀手锏是线程池(Thread Pool)和InnoDB 并行查询(PQ),必须开启以应对高并发。
# /etc/my.cnf (GreatSQL 8.0.25+) [mysqld] # 1. 线程池(解决 C10K 问题,替代 one-thread-per-connection) thread_handling = pool-of-threads thread_pool_max_threads = 1000 # 2. InnoDB 内核优化(针对郑州常见的国产 SSD 环境) innodb_buffer_pool_size = 物理内存的 70% innodb_io_capacity = 20000 # 适配 NVMe SSD innodb_io_capacity_max = 40000 innodb_flush_log_at_trx_commit = 1 # 政务/金融保持强一致 innodb_lock_wait_timeout = 10 # 3. 并行查询(针对复杂统计) loose-force_parallel_execute = ON loose-parallel_default_dop = 8 # 并行度,建议设为逻辑CPU数/2 loose-parallel_cost_threshold = 1000 # 成本阈值,低于此值不并行 # 4. 连接与安全 max_connections = 2000 skip_name_resolve = ON # 关闭 DNS 反查,加速连接 default_time_zone = '+8:00' # 显式指定东八区说明:线程池能有效避免连接数暴增时的系统抖动,这是 GreatSQL 相比社区 MySQL 在高并发下的核心优势。
2. JDBC 连接配置
GreatSQL 完全兼容 MySQL 协议,使用标准驱动即可。
# GreatSQL JDBC URL (直连或通过代理) url: jdbc:mysql://greatsql-host:3306/app_db?useUnicode=true&characterEncoding=utf8 &rewriteBatchedStatements=true # 同样需要批量优化 &useSSL=false &allowPublicKeyRetrieval=true &useServerPrepStmts=true # 开启服务端预编译 &cachePrepStmts=true # 缓存预编译语句 &prepStmtCacheSize=250 &prepStmtCacheSqlLimit=20483. 应用层避坑指南
索引设计:GreatSQL 的锁机制(尤其是针对 Secondary Index)有优化,但依然要求必须有主键。联合主键的字段顺序对性能影响极大。
事务隔离:默认使用
REPEATABLE-READ,在高并发更新场景下,若出现锁等待,可评估是否降级为READ-COMMITTED(需业务逻辑允许)。并行查询触发:对于慢报表,可在 Java SQL 中添加 Hint 强制并行:
SELECT /*+ PQ(8) */ ...。
三、通用调优策略(两者均适用)
连接池复用:无论哪种数据库,都必须使用 HikariCP 或 Druid,严禁在方法内直接
DriverManager.getConnection()。PreparedStatement 缓存:必须开启
cachePrepStmts,避免重复解析 SQL 语法。索引与分页:
LIMIT分页必须带排序字段索引,否则 OceanBase 的分布式排序和 GreatSQL 的大表扫描都会极慢。超时与重试:Java 代码中必须设置合理的超时(
queryTimeout),并针对网络闪断设计指数退避重试机制。
四、郑州本地化场景选型与调优总结
场景 | 数据库选型 | Java 调优重点 |
|---|---|---|
政务核心(高一致) | OceanBase | 配置强一致性读( |
政务 OA / 审批 | GreatSQL | 开启线程池,配置并行查询应对历史数据统计,利用国产 SSD 的 IO 能力。 |
金融交易(海量) | OceanBase | 应用层做分库分表键设计(即使 OB 透明,也建议设计),利用批量写入。 |
SaaS 多租户 | GreatSQL | 利用 |
最终建议:
如果你在用OceanBase,请把精力花在网络优化和批量处理上,这是分布式系统的命门。
如果你在用GreatSQL,请务必在
my.cnf中写上thread_handling = pool-of-threads,这是你应对高并发最省心的武器。