Java数据库连接提速优化

wen java案例 32

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>

实际优化案例

案例:订单查询优化

优化前:

Java数据库连接提速优化

// 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优化两个方面入手,逐步实施其他优化措施。

抱歉,评论功能暂时关闭!