SymmetricDS连接SQL Server读取元数据时遇AbstractMethodError错误
问题排查:SymmetricDS连接SQL Server 2016触发AbstractMethodError
问题背景
SQL Server版本:2016(v13.0.4259.0),平台NT64x
通过SymmetricDS执行命令测试连接:
dbsql --engine store-001
store-001配置:
engine.name=store-001 db.driver=net.sourceforge.jtds.jdbc.Driver db.url=jdbc:jtds:sqlserver://192.168.16.123:1433/crawlers_sm;useCursors=true;bufferMaxMemory=10240;lobBuffer=5242880 db.user=user db.password=password registration.url=http://localhost:31415/sync/corp-000 group.id=store external.id=001 job.routing.period.time.ms=5000 job.push.period.time.ms=10000 job.pull.period.time.ms=10000
执行后抛出异常:
An exception occurred. Please see the following for details: ------------------------------------------------------------------------------- java.lang.AbstractMethodError at net.sourceforge.jtds.jdbc.JtdsConnection.isValid(JtdsConnection.java:2833) at org.apache.commons.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:590) at org.apache.commons.dbcp2.PoolableConnection.validate(PoolableConnection.java:334) at org.apache.commons.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:653) at org.apache.commons.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:109) at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:649) at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:531) at org.jumpmind.db.util.ResettableBasicDataSource.createDataSource(ResettableBasicDataSource.java:55) at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:731) at org.jumpmind.db.platform.JdbcDatabasePlatformFactory.determineDatabaseNameVersionSubprotocol(JdbcDatabasePlatformFactory.java:271) [wrapped] org.jumpmind.db.sql.SqlException: Error while reading the database metadata: null at org.jumpmind.db.platform.JdbcDatabasePlatformFactory.determineDatabaseNameVersionSubprotocol(JdbcDatabasePlatformFactory.java:287) at org.jumpmind.db.platform.JdbcDatabasePlatformFactory.create(JdbcDatabasePlatformFactory.java:238) at org.jumpmind.symmetric.ClientSymmetricEngine.createDatabasePlatform(ClientSymmetricEngine.java:367) at org.jumpmind.symmetric.ClientSymmetricEngine.createDatabasePlatform(ClientSymmetricEngine.java:326) at org.jumpmind.symmetric.AbstractCommandLauncher.getDatabasePlatform(AbstractCommandLauncher.java:287) at org.jumpmind.symmetric.DbSqlCommand.executeWithOptions(DbSqlCommand.java:73) at org.jumpmind.symmetric.AbstractCommandLauncher.execute(AbstractCommandLauncher.java:153) at org.jumpmind.symmetric.DbSqlCommand.main(DbSqlCommand.java:42)
连接Oracle正常,已确认SymmetricDS兼容SQL Server。
问题根源
java.lang.AbstractMethodError是因为JTDS驱动版本过低,未实现JDBC 4.0规范要求的Connection.isValid()方法,而SymmetricDS依赖的Apache DBCP2连接池会在验证连接时调用该方法,导致报错。
解决方案
方案1:替换为微软官方SQL Server JDBC驱动(推荐)
JTDS已停止维护,微软官方驱动对新版SQL Server和JDBC规范支持更好:
- 修改配置文件:
- 将
db.driver改为:com.microsoft.sqlserver.jdbc.SQLServerDriver - 将
db.url调整为官方驱动格式:db.url=jdbc:sqlserver://192.168.16.123:1433;databaseName=crawlers_sm;useCursors=true;bufferMaxMemory=10240;lobBuffer=5242880
- 将
- 添加驱动jar包:
下载对应Java版本的SQL Server JDBC驱动(如mssql-jdbc-12.4.0.jre8.jar),放入SymmetricDS的lib目录,同时删除原有的jtds.jar。
方案2:升级JTDS驱动到最新版(不推荐)
如果坚持使用JTDS,需升级到最后维护版本(1.3.2):
- 下载最新版
jtds-1.3.2.jar替换SymmetricDSlib目录中的旧版本。 - 保持原有配置不变,重新测试连接。
验证步骤
修改配置/替换驱动后,重新执行:
dbsql --engine store-001
若连接成功则问题解决。
内容的提问来源于stack exchange,提问作者Marine Fighter
相关产品推荐
相关产品推荐

