异常堆栈如下:
Exception in thread "main" java.lang.AbstractMethodError: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.getSchema()Ljava/lang/String;
at org.apache.shardingsphere.sql.parser.binder.metadata.util.JdbcUtil.getSchema(JdbcUtil.java:41)
at org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaDataLoader.isTableExist(ColumnMetaDataLoader.java:108)
at org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaDataLoader.load(ColumnMetaDataLoader.java:56)
at org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaDataLoader.load(TableMetaDataLoader.java:46)
at org.apache.shardingsphere.core.metadata.ShardingMetaDataLoader.load(ShardingMetaDataLoader.java:83)
at org.apache.shardingsphere.core.metadata.ShardingMetaDataLoader.loadShardingSchemaMetaData(ShardingMetaDataLoader.java:134)
at org.apache.shardingsphere.core.metadata.ShardingMetaDataLoader.load(ShardingMetaDataLoader.java:125)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.context.ShardingRuntimeContext.loadSchemaMetaData(ShardingRuntimeContext.java:65)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.context.MultipleDataSourcesRuntimeContext.createMetaData(MultipleDataSourcesRuntimeContext.java:57)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.context.MultipleDataSourcesRuntimeContext.<init>(MultipleDataSourcesRuntimeContext.java:51)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.context.ShardingRuntimeContext.<init>(ShardingRuntimeContext.java:49)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.ShardingDataSource.<init>(ShardingDataSource.java:54)
at org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory.createDataSource(ShardingDataSourceFactory.java:48)
at com.alipay.datasource.test.sharding.jdbc.Main.main(Main.java:46)
两者版本不兼容导致的异常,如果只是想解决问题,直接拉到最底,替换下对应jar版本即可。
如上异常,sharing-jdbc-core和commons-dbcp版本,
<!-- Sharing JDBC -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>4.1.1</version>
</dependency>
<!--dbcp连接池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.3</version>
</dependency>
sharing-jdbc-core 4.1.1版本里面使用到Connection#getSchema
方法,
1.3版本的dbcp PoolingDataSource$PoolGuardConnectionWrapper
里没有实现该方法,两者版本不兼容,导致AbstractMethodError
异常。
第一次版本替换,将sharding-jdbc-core降到4.0.1,
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>4.0.1</version>
</dependency>
<!--dbcp连接池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.3</version>
</dependency>
又报如下异常
Exception in thread "main" java.lang.AbstractMethodError: Method org/apache/commons/dbcp/DelegatingDatabaseMetaData.supportsStoredFunctionsUsingCallSyntax()Z is abstract
at org.apache.commons.dbcp.DelegatingDatabaseMetaData.supportsStoredFunctionsUsingCallSyntax(DelegatingDatabaseMetaData.java)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.metadata.CachedDatabaseMetaData.<init>(CachedDatabaseMetaData.java:430)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.context.ShardingRuntimeContext.createCachedDatabaseMetaData(ShardingRuntimeContext.java:68)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.context.ShardingRuntimeContext.<init>(ShardingRuntimeContext.java:60)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.ShardingDataSource.<init>(ShardingDataSource.java:48)
at org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory.createDataSource(ShardingDataSourceFactory.java:50)
at com.alipay.datasource.test.sharding.jdbc.Main.main(Main.java:46)
还是版本不兼容导致的,1.3版本dbcp对应的supportsStoredFunctionsUsingCallSyntax
方法被注释掉了。
经过测试,目前兼容的版本如下:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>4.0.1</version>
</dependency>
<!--dbcp连接池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>