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"); |
全部 |
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() { |
全部 |
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);//超时多长时间后返回 |
|