驱动与Tomcat JDBC连接池连接失败问题排查求助
看起来你遇到了个有点矛盾的问题——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

