本文基于某电商平台亿级商品详情页场景,通过Java应用层与数据库层的协同优化,实现98%的查询响应时间低于50ms。
一、JDBC连接池深度调优
HikariCP配置示例:
java
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优化示例:
java
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优化示例:
java
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);
}
}
四、分布式查询优化
读写分离与负载均衡:
java
// 自定义数据源路由
public class OceanBaseRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected 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协议优化:
XML
// 在JDBC URL中添加TCP参数
jdbc:oceanbase://192.168.1.100:6033/testdb?tcpNoDelay=true&tcpKeepAlive=true&socketTimeout=3000
性能对比:
