[Java实战]Spring Boot整合达梦数据库连接池配置(三十四)

Java实战Spring Boot整合达梦数据库连接池配置(三十四)

一、HikariCP连接池配置(默认)

1. 基础配置(application.yml

yaml 复制代码
spring:
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://localhost:5236/DB_NAME?schema=SYSDBA
    username: SYSDBA
    password: SYSDBA
    # HikariCP连接池配置
    hikari:
      pool-name: DM-HikariPool
      connection-timeout: 30000  # 连接超时时间(ms)
      maximum-pool-size: 20      # 最大连接数
      minimum-idle: 5           # 最小空闲连接
      idle-timeout: 600000      # 空闲连接超时时间(ms)
      max-lifetime: 1800000     # 连接最大存活时间(ms)
      connection-test-query: SELECT 1 FROM DUAL

2. 验证配置生效

在应用启动日志中搜索 HikariPool-1 - Starting... 确认连接池初始化成功:

log 复制代码
2024-05-26 14:20:00.123 INFO  [main] com.zaxxer.hikari.HikariDataSource 
- HikariPool-1 - Starting...
2024-05-26 14:20:01.456 INFO  [main] com.zaxxer.hikari.HikariDataSource 
- HikariPool-1 - Start completed.

二、Druid连接池配置(推荐监控功能)

1. 添加Druid依赖(pom.xml

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.18</version>
</dependency>
        <!-- 达梦JDBC驱动 -->
 <dependency>
        <groupId>com.dameng</groupId>
        <artifactId>Dm8JdbcDriver18</artifactId>
        <version>8.1.1.49</version>
 </dependency>

2. 完整配置(application.yml

yaml 复制代码
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://localhost:5236/DB_NAME?schema=SYSDBA
    username: SYSDBA
    password: SYSDBA
    
    druid:
      # 连接池核心配置
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      
      # 监控配置
      filter:
        stat:
          enabled: true
          log-slow-sql: true
          slow-sql-millis: 2000
      web-stat-filter:
        enabled: true
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        login-username: admin
        login-password: admin123

3. 添加达梦方言配置类

java 复制代码
@Configuration
public class DruidConfig {

    @Bean
    public DruidStatInterceptor druidStatInterceptor() {
        return new DruidStatInterceptor();
    }

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public Advisor druidStatAdvisor() {
        return new DefaultPointcutAdvisor(
            new AnnotationMatchingPointcut(WebService.class, null),
            druidStatInterceptor()
        );
    }
}

4. 访问监控页面

启动应用后访问监控面板:
http://localhost:8080/druid/login.html

使用配置的用户名密码登录(示例中为admin/admin123

三、连接池验证测试

测试1:连接泄漏检测

java 复制代码
@SpringBootTest
public class ConnectionLeakTest {

    @Autowired
    private DataSource dataSource;

    @Test
    public void testConnectionLeak() throws SQLException {
        for(int i=0; i<30; i++) {
            Connection conn = dataSource.getConnection();
            // 未关闭连接,触发连接池警告
            System.out.println("获取连接:"+conn);
        }
    }
}

预期日志

log 复制代码
ERROR [alibaba.druid.pool.DruidDataSource] - discard connection, 
activeCount 20, maxActive 20

测试2:性能压力测试

使用JMeter模拟100并发查询请求,观察连接池表现:

监控指标 正常范围 异常处理建议
ActiveCount <= maxActive 调大maxActive
WaitThreadCount 持续>0 检查慢SQL或连接泄漏
PoolingCount ≈ maxActive/2 调整initialSize/minIdle

四、生产环境最佳实践

1. 连接池参数建议

yaml 复制代码
druid:
  max-active: 50            # 根据DB最大连接数设置
  initial-size: 10
  min-idle: 10
  max-wait: 3000            # 获取连接超时时间
  time-between-eviction-runs-millis: 60000  # 检测间隔
  min-evictable-idle-time-millis: 300000     # 最小空闲时间

2. 安全加固

yaml 复制代码
druid:
  filter:
    wall:
      config:
        delete-allow: false   # 禁止DELETE无WHERE
        drop-table-allow: false

3. 定期监控指标

  • 活跃连接数DataSource.getActiveCount()
  • 等待线程数DataSource.getWaitThreadCount()
  • SQL执行时间:通过Druid监控页查看

五、常见问题解决

问题1:连接池初始化失败

错误信息Failed to initialize pool: Unknown database 'DB_NAME'
解决方案

  1. 检查达梦服务是否运行
  2. 验证数据库名称是否正确
  3. 确认用户权限:SYSDBA默认有DBA权限

问题2:连接泄漏

现象 :活跃连接数持续增长不释放
排查步骤

  1. 启用Druid的removeAbandoned配置

    yaml 复制代码
    druid:
      remove-abandoned: true
      remove-abandoned-timeout: 300  # 5分钟未关闭连接强制回收
  2. 分析日志中abandoned connection警告定位代码

希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!

相关推荐
没钥匙的锁126 分钟前
16-Java反射机制:Spring IOC背后的核心技术
java·开发语言·spring
geinvse_seg38 分钟前
飞算JavaAI:把企业采购协同需求拆成一套可运行的慧采平台
java·ai·飞算
石一峰6991 小时前
驱动:私有数据为什么要在三个地方各挂一遍?
数据库·python·算法
ClouGence1 小时前
跨云、跨地域数据同步,这样更省心
数据库·sql·saas
TDengine (老段)2 小时前
TDengine 函数完整参考 — 聚合、时序、字符串、时间、数学
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
烛影摇红透纱窗2 小时前
ForkJoinPool 与工作窃取
java
浩瀚地学2 小时前
【面试算法笔记】0302-哈希表-哈希表实现
java·经验分享·笔记·算法·面试
AC赳赳老秦2 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw
TDengine (老段)3 小时前
昆仑数智选择 TDengine TSDB,提升页岩气生产运行可视化与精细化管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
陆水A3 小时前
【问数系统】SQL跑对了图表却空了?打通问数系统最后1公里的3个API坑
大数据·数据库·自然语言处理·big data·etl工程师