使用Denodo驱动创建Hikari DataSource及重复查询失败问题
解决Denodo+Hikari连接池首次查询正常、后续获取连接超时问题
问题分析
从日志和报错信息来看,核心问题有两个:
- Hikari无法通过
com.denodo.vdp.jdbc.Driver找到注册的驱动,只能直接实例化,说明驱动类名可能配置错误,或者驱动包内的实际类路径不符 - 首次查询后连接池无法提供可用连接,大概率是连接未被正确回收、连接已被Denodo端失效但Hikari未检测到,或者连接池适配配置缺失
具体解决方案
1. 修正驱动类配置
日志中实际创建的连接类是com.denodo.vdb.jdbcdriver.VDBJDBCConnection,说明驱动包内的Driver类路径可能不是com.denodo.vdp.jdbc.Driver,而是com.denodo.vdb.jdbcdriver.Driver:
- 解压
denodo-driver.jar,确认META-INF/services/java.sql.Driver文件中的驱动类名,或者直接搜索包内的Driver类 - 替换配置中的
driverClassName为实际存在的类名,或者不设置driverClassName,让Hikari通过JDBC URL自动识别驱动(Denodo的JDBC URL格式为jdbc:vdb://<host>:<port>/<database>)
2. 优化Hikari连接池适配配置
Denodo JDBC驱动不支持网络超时设置,需要补充连接验证、超时相关配置,避免连接失效后无法被池检测到:
@Bean DataSource dataSourceDenodo() { HikariConfig config = new HikariConfig(); // 推荐:不手动指定driverClassName,让Hikari自动从JDBC URL识别 config.setJdbcUrl(env.getProperty("denodo.jdbcUrl")); config.setUsername(env.getProperty("denodo.userName")); config.setPassword(env.getProperty("denodo.password")); config.setMaximumPoolSize(30); config.setPoolName("denodo"); // 关键适配配置 config.setConnectionTimeout(30000); // 连接获取超时时间,单位ms config.setValidationTimeout(5000); // 连接验证超时时间 config.setIdleTimeout(600000); // 连接空闲超时,超过则回收,需小于Denodo服务器的连接超时 config.setMaxLifetime(1800000); // 连接最大生命周期,建议设为Denodo服务器超时的2/3 config.setConnectionTestQuery("SELECT 1"); // 用简单SQL验证连接有效性,替代不支持的网络超时检测 config.setRegisterMbeans(false); // 禁用MBean注册,避免不必要的日志 return new HikariDataSource(config); }
3. 检查连接使用逻辑
如果是手动获取连接而非使用Spring JdbcTemplate等自动管理工具,必须确保连接在使用后被正确关闭(放回池):
// 正确示例:使用try-with-resources自动关闭连接 try (Connection conn = dataSource.getConnection()) { // ...执行查询逻辑 } catch (SQLException e) { // 异常处理 }
4. 匹配驱动与Denodo服务器版本
确保使用的denodo-driver.jar版本与Denodo服务器版本完全一致,不同版本的驱动类路径、连接逻辑可能存在差异,避免版本不兼容导致的连接异常。
日志警告说明
Driver does not support get/set network timeout for connections:属于Denodo驱动的特性限制,通过配置connectionTestQuery即可规避该问题对连接池的影响Registered driver with driverClassName=... was not found:修正驱动类名或不手动指定driverClassName后,该警告会消失
内容的提问来源于stack exchange,提问作者fromthebasement
相关产品推荐
相关产品推荐

