Dataflow用JTDS连SQL Server遇AbstractMethodError,求验证查询方案
解决Dataflow JDBCIO连接SQL Server的AbstractMethodError错误
错误原因
这个java.lang.AbstractMethodError是因为jTDS驱动(net.sourceforge.jtds.jdbc.Driver)的isValid方法实现不符合Apache Commons DBCP2的要求——DBCP2调用的是JDBC 4规范中带参数的isValid(int timeout)方法,但旧版本jTDS仅实现了无参的isValid()方法,导致反射调用时出错。
解决方案一:添加连接验证查询
通过自定义BasicDataSource设置验证查询,替代默认的isValid方法验证逻辑,修改你的buildDataSourceConfig方法:
private static DataSourceConfiguration buildDataSourceConfig(Options options, String url) throws Exception { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("net.sourceforge.jtds.jdbc.Driver"); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(pass); // 用SQL Server验证查询替代默认的isValid方法 dataSource.setValidationQuery("SELECT 1"); dataSource.setTestOnBorrow(true); return DataSourceConfiguration.create(dataSource); }
这样DBCP2会通过SELECT 1验证连接有效性,不再调用有问题的isValid方法。
解决方案二:换用官方SQL Server JDBC驱动
jTDS已长期未维护,建议替换为微软官方SQL Server JDBC驱动,从根源避免兼容性问题:
- 替换驱动类名为
com.microsoft.sqlserver.jdbc.SQLServerDriver - 调整JDBC URL格式为官方规范:
jdbc:sqlserver://<host>:<port>;databaseName=<dbname> - 修改配置方法:
private static DataSourceConfiguration buildDataSourceConfig(Options options, String url) throws Exception { return DataSourceConfiguration .create("com.microsoft.sqlserver.jdbc.SQLServerDriver", url) .withUsername(user) .withPassword(pass); }
官方驱动完全兼容JDBC 4规范与DBCP2,无需额外设置验证查询。
验证修改
修改后重新提交Dataflow作业,检查是否仍出现AbstractMethodError错误。
内容的提问来源于stack exchange,提问作者Ben Delany
相关产品推荐
相关产品推荐

