You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

驱动与Tomcat JDBC连接池连接失败问题排查求助

排查Tomcat JDBC连接池SQLServer驱动异常问题

看起来你遇到了个有点矛盾的问题——SOAP UI能正常拿到数据,但控制台一直抛SQL驱动相关的异常。别着急,咱们从几个常见的坑入手排查:

  • 检查SQLServer驱动类名是否正确
    你代码里用的com.microsoft.jdbc.sqlserver.SQLServerDriver是旧版本的驱动类名,从SQL Server JDBC驱动6.0版本开始,官方已经把类名改成了com.microsoft.sqlserver.jdbc.SQLServerDriver。旧类名在新驱动包中已经被移除,这是导致这个异常最常见的原因。

  • 确认驱动包版本与类名匹配
    如果你用的是mssql-jdbc系列的新驱动包(比如Maven依赖里的com.microsoft.sqlserver:mssql-jdbc),必须使用新的类名。可以检查项目的依赖管理文件(比如pom.xml)或者lib目录里的驱动包版本,确保类名和版本对应。

  • 清理冗余的DriverManager调用
    你的代码里先调用了DriverManager.getConnection(url, username, password),然后才初始化连接池。这一步完全多余,而且可能提前加载了旧的驱动类,干扰连接池的正常初始化。建议直接删除这行代码,所有连接都通过连接池获取。

  • 验证连接池的使用方式
    确保后续获取数据库连接时,是通过你创建的datasource.getConnection()来获取,而不是再次调用DriverManager。连接池初始化完成后,应该完全依赖它来管理连接。

修正后的代码示例

public static Connection getConnection() { 
    try { 
        PoolProperties poolProperties = new PoolProperties(); 
        String url = prop.getUrl(); 
        // 使用新版本SQLServer驱动类名
        String drivername = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; 
        String username = prop.getUsername(); 
        String password = prop.getPassword(); 

        // 移除多余的DriverManager.getConnection调用
        // conn = DriverManager.getConnection(url, username, password); 

        poolProperties.setUrl(url); 
        poolProperties.setDriverClassName(drivername); 
        poolProperties.setUsername(username); 
        poolProperties.setPassword(password); 
        poolProperties.setMaxActive(MAX_ACTIVE); 
        poolProperties.setMaxIdle(MAX_IDLE); 
        poolProperties.setMinIdle(MIN_IDLE); 
        poolProperties.setInitialSize(MIN_POOL_SIZE); 
        poolProperties.setMaxWait(MAX_WAIT); 
        poolProperties.setRemoveAbandonedTimeout(REMOVE_ABANDONED_TIMEOUT); 
        poolProperties.setMinEvictableIdleTimeMillis(MIN_EVICTABLE_IDLE_TIMEMILLIS); 
        poolProperties.setValidationQuery(Validation_Query); 
        poolProperties.setValidationInterval(VALIDATION_INTERVAL); 
        poolProperties.setTimeBetweenEvictionRunsMillis(TIME_BETWEEN_EVICTION_RUNS_MILLTS); 
        
        // 直接强转避免重复类型转换
        org.apache.tomcat.jdbc.pool.DataSource datasource = new org.apache.tomcat.jdbc.pool.DataSource(); 
        datasource.setPoolProperties(poolProperties); 
        datasource.createPool(); 
        logger.info("The connection is from " + drivername); 

        // 从连接池获取连接并返回
        return datasource.getConnection();
    } catch (SQLException e) {
        logger.error("Failed to initialize connection pool or get connection", e);
        throw new RuntimeException("Database connection failed", e);
    } catch (Exception e) {
        logger.error("Unexpected error when setting up connection pool", e);
        throw new RuntimeException(e);
    }
}

另外,检查你的Validation_Query是否是SQL Server支持的语句,比如使用SELECT 1或者SELECT @@VERSION都可以,避免验证查询本身出错导致连接池初始化失败。

内容的提问来源于stack exchange,提问作者boldercoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:05