本文基于某电商平台亿级商品详情页场景,通过Java应用层与数据库层的协同优化,实现98%的查询响应时间低于50ms。
一、JDBC连接池深度调优
HikariCP配置示例:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oceanbase://192.168.1.100:6033/testdb?useSSL=false");
config.setUsername("root");
config.setPassword("password");// 核心参数调优
config.setMaximumPoolSize(500); // 根据CPU核数设定
config.setMinimumIdle(200); // 保持热备连接
config.setIdleTimeout(30000); // 连接空闲超时时间
config.setMaxLifetime(1800000); // 连接最大生命周期
config.setConnectionInitSql("SET NAMES utf8mb4"); // 设置字符集
二、批处理与多路归并
BatchInsert优化示例:
public void batchInsert(List<Order> orders) {try (Connection conn = dataSource.getConnection();PreparedStatement pstmt = conn.prepareStatement("INSERT INTO orders (user_id, product_id, amount) VALUES (?, ?, ?)") {{int batchSize = 1000;int count = 0;for (Order order : orders) {pstmt.setInt(1, order.getUserId());pstmt.setInt(2, order.getProductId());pstmt.setBigDecimal(3, order.getAmount());pstmt.addBatch();if (++count % batchSize == 0) {pstmt.executeBatch();count = 0;}}pstmt.executeBatch(); // 处理剩余数据}} catch (SQLException e) {// 异常处理}
}
三、结果集流式处理
RowBuffer优化示例:
public List<UserProfile> fetchUserProfiles(int userId) {String sql = "SELECT * FROM user_profile WHERE user_id = ?";try (Connection conn = dataSource.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {{pstmt.setInt(1, userId);ResultSet rs = pstmt.executeQuery();return ResultSetUtils.stream(rs).map(this::mapUserProfile).collect(Collectors.toList());}} catch (SQLException e) {// 异常处理}
}// 使用流式处理减少内存占用
static class ResultSetUtils {public static <T> Stream<T> stream(ResultSet rs) throws SQLException {return StreamSupport.stream(Spliterators.spliteratorUnknownSize(() -> new ResultSetIterator<>(rs), Spliterator.ORDERED), false);}
}
四、分布式查询优化
读写分离与负载均衡:
// 自定义数据源路由
public class OceanBaseRoutingDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return ThreadLocalContext.getReadOnlyFlag() ? "readonly" : "write";}
}// 配置读写分离组
@Bean
public DataSource routingDataSource() {OceanBaseRoutingDataSource dataSource = new OceanBaseRoutingDataSource();dataSource.setTargetDataSources({readOnlyDataSource(), // 3个只读节点writeDataSource() // 2个写节点});dataSource.setDefaultTargetDataSource(writeDataSource());return dataSource;
}
五、协议栈优化
启用TCP协议优化:
// 在JDBC URL中添加TCP参数
jdbc:oceanbase://192.168.1.100:6033/testdb?tcpNoDelay=true&tcpKeepAlive=true&socketTimeout=3000
性能对比: