druid连接池在处理元数据时需要注意的问题

最后更新:2024-09-08 05:30:01 | 状态:未完成

序号 标题 说明 引发问题 处理 数据库
1 getschema() 没有实现
public String getschema() throws SQLException {
throw new SOLFeatureNotSupportedException()
}
看了几个版本的源码,这个方法就没有实现
会抛出异常
java.lang.AbstractMethodError: Receiver class oracle.jdbc.driver.T4CConnection does not define or inherit an implementation of the resolved method abstract getSchema()Ljava/lang/String; of interface java.sql.Connection.
    at com.alibaba.druid.pool.DruidPooledConnection.getSchema(DruidPooledConnection.java:1222) ~[druid-1.2.18.jar:na]
    at org.anyline.environment.spring.data.jdbc.SpringJDBCWorker.checkSchema(SpringJDBCWorker.java:175) ~[anyline-environment-spring-data-jdbc-8.7.2-20240702.jar:na]
    at org.anyline.environment.spring.data.jdbc.SpringJDBCWorker.checkSchema(SpringJDBCWorker.java:110) ~[anyline-environment-spring-data-jdbc-8.7.2-20240702.jar:na]
    at org.anyline.environment.spring.data.jdbc.SpringJDBCWorker.checkSchema(SpringJDBCWorker.java:141) ~[anyline-environment-spring-data-jdbc-8.7.2-20240702.jar:na]
    at org.anyline.data.jdbc.adapter.init.AbstractJDBCAdapter.checkSchema(AbstractJDBCAdapter.java:9529) ~[anyline-data-jdbc-8.7.2-20240702.jar:na]
    at org.anyline.data.jdbc.adapter.init.OracleGenusAdapter.checkSchema(OracleGenusAdapter.java:6801) ~[anyline-data-jdbc-8.7.2-20240702.jar:na]
    at org.anyline.data.jdbc.oracle.OracleAdapter.checkSchema(OracleAdapter.java:6332) ~[anyline-data-jdbc-oracle-8.7.2-20240702.jar:na]
    at org.anyline.data.adapter.init.AbstractDriverAdapter.tables(AbstractDriverAdapter.java:4258) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.data.jdbc.adapter.init.AbstractJDBCAdapter.tables(AbstractJDBCAdapter.java:3011) ~[anyline-data-jdbc-8.7.2-20240702.jar:na]
    at org.anyline.data.adapter.init.AbstractDriverAdapter.tables(AbstractDriverAdapter.java:4451) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.data.jdbc.adapter.init.AbstractJDBCAdapter.tables(AbstractJDBCAdapter.java:3033) ~[anyline-data-jdbc-8.7.2-20240702.jar:na]
    at org.anyline.data.jdbc.oracle.OracleAdapter.tables(OracleAdapter.java:1702) ~[anyline-data-jdbc-oracle-8.7.2-20240702.jar:na]
    at org.anyline.dao.init.DefaultDao.tables(DefaultDao.java:978) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.dao.AnylineDao.tables(AnylineDao.java:742) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.service.init.DefaultService$2.tables(DefaultService.java:1989) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.service.AnylineService$MetaDataService.tables(AnylineService.java:1927) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.service.AnylineService$MetaDataService.tables(AnylineService.java:1930) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.service.AnylineService$MetaDataService.tables(AnylineService.java:1992) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.service.init.DefaultService$2.table(DefaultService.java:2053) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.service.AnylineService$MetaDataService.table(AnylineService.java:2043) ~[anyline-data-8.7.2-20240702.jar:na]
    at org.anyline.service.AnylineService$MetaDataService.table(AnylineService.java:2074) ~[anyline-data-8.7.2-20240702.jar:na]


检测表的schema时匹配失败,所以没有返回表
可以换回spring默认的连接池或者通过官方驱动代替这个方法或者换druid版本1.1.15
推荐操作元数据时用,hikari 业务数据用druid
如果非要用druid操作元数据应该根据不同的数据库模式,显示指定catalog,schema
如pg环境:

Table table = new Table("simple","public","hr_user");
table.addColumn("ID","INT");
service.ddl().create(table);


全部
2 getCatalog()实现错误 在sqlite中,应该没有catalog,但实际调用getCatalogName时返回了表名 查构造完整表名时,会把错误的catalog拼接上 adapter中已处理 sqlite
3 cblob类型被封装

在读取clob类型的数据时返回了com.alibaba.druid.proxy.jdbc.NClobProxyImpl

对于基础类型与官方驱动内置类型 anyline可以转换成项目运行实际需要的类型,如把clob类型转换成String

如pg驱动中的point转换成double[]或Point对象

但其他类型则按原样返回

项目中需要单独处理一个严重依赖连接池的数据类型

需要注册一个DataReader,在查询数据库遇到此类型后按read实现的方法处理,

如DataReaderFactory.reg(new Object[]{NClobProxyImpl.class}, new DataReader() {
    public Object read(Object value) {
//在这个方法中处理成实际需要的类型
    }});}参考:http://doc.anyline.org/aa/f7_13985

全部
4 连接失败无限重试

配置文件
spring.datasource.druid.connectionErrorRetryAttempts = 1 
spring.datasource.druid.breakAfterAcquireFailure = true
或Java
DruidDataSource ds = new DruidDataSource();ds.setConnectionErrorRetryAttempts(0); //失是不是败重连次数
ds.setBreakAfterAcquireFailure(true);//失败后是不是中断,true:中断 抛出异常 false:重试
ds.setMaxWait(30000);//超时多长时间后返回




首页 最近更新 搜索 提交 回复