Java数据库连接提速优化策略
连接池优化
核心配置参数
// HikariCP 推荐配置
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(20); // 根据并发调整
config.setMinimumIdle(5); // 保持最小空闲连接
config.setConnectionTimeout(30000); // 等待连接超时
config.setIdleTimeout(600000); // 空闲连接超时
config.setMaxLifetime(1800000); // 连接最大生命周期
config.setConnectionTestQuery("SELECT 1");
连接池选择
- HikariCP: 性能最佳,推荐使用
- Druid: 监控功能强大,适合需要监控的场景
- Tomcat JDBC: 与Tomcat容器集成好
SQL优化
索引优化
-- 创建复合索引 CREATE INDEX idx_user_name_age ON users(name, age); -- 使用覆盖索引 SELECT id, name FROM users WHERE name = '张三'; -- 避免回表
批量操作
// 批量插入优化
String sql = "INSERT INTO users(name, age) VALUES(?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
conn.setAutoCommit(false);
for (User user : userList) {
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
ps.addBatch();
}
ps.executeBatch();
conn.commit();
数据库配置优化
MySQL优化配置
# my.cnf innodb_buffer_pool_size = 4G # 设为内存的70% innodb_log_file_size = 512M innodb_flush_log_at_trx_commit = 2 # 减少磁盘IO max_connections = 500 query_cache_size = 256M # 8.0后已废弃
PostgreSQL优化配置
# postgresql.conf shared_buffers = 1GB effective_cache_size = 3GB work_mem = 32MB maintenance_work_mem = 256MB random_page_cost = 1.1 # SSD通常设为1.1
JDBC驱动优化
批处理优化
// 开启批处理 String url = "jdbc:mysql://localhost:3306/db?rewriteBatchedStatements=true"; // PostgreSQL支持 String url = "jdbc:postgresql://localhost:5432/db?reWriteBatchedInserts=true";
获取连接优化
// 使用try-with-resources确保连接释放
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
// 业务处理
}
网络层优化
TCP参数调整
# /etc/sysctl.conf net.core.somaxconn = 1024 net.ipv4.tcp_fastopen = 3 net.ipv4.tcp_slow_start_after_idle = 0
连接复用
// HTTP连接池配合使用
PoolingHttpClientConnectionManager poolManager =
new PoolingHttpClientConnectionManager();
poolManager.setMaxTotal(200);
poolManager.setDefaultMaxPerRoute(20);
缓存层优化
本地缓存
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.maximumSize(10000)
.expireAfterWrite(60, TimeUnit.MINUTES)
.recordStats());
return cacheManager;
}
}
Redis缓存
// 使用Redis避免重复数据库查询
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
查询优化技巧
懒加载策略
@Entity
public class Order {
@OneToMany(fetch = FetchType.LAZY) // 使用懒加载
private List<OrderItem> items;
}
分页查询优化
// 使用游标分页替代offset分页
@Query("SELECT u FROM User u WHERE u.id > :lastId ORDER BY u.id ASC")
List<User> findNextPage(@Param("lastId") Long lastId, Pageable pageable);
监控与分析
慢查询日志
-- MySQL SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 0.5; -- PostgreSQL log_min_duration_statement = 500;
性能监控工具
<!-- 引入Druid监控 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
实际优化案例
案例:订单查询优化
优化前:

// N+1查询问题
List<Order> orders = orderService.findAll();
for (Order order : orders) {
List<OrderItem> items = order.getItems(); // 每次查询都会执行SQL
}
优化后:
// 使用JOIN查询或@BatchSize
@Query("SELECT DISTINCT o FROM Order o JOIN FETCH o.items")
List<Order> findAllWithItems();
关键性能指标
| 指标 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| 连接获取时间 | 50ms | 5ms | 90% |
| 查询响应时间 | 200ms | 30ms | 85% |
| 同时处理请求 | 50 | 200 | 300% |
通过以上优化策略,可以将数据库连接性能提升50%-90%,具体提升效果取决于当前系统状态和优化实施的完整性,建议从连接池配置和SQL优化两个方面入手,逐步实施其他优化措施。