使用阿里云的MaxCompute查询sql时报错:DruidPooledPreparedStatement: getMaxFieldSize error

📅 2026/7/16 18:38:00
使用阿里云的MaxCompute查询sql时报错:DruidPooledPreparedStatement: getMaxFieldSize error
文章目录问题描述解决方法解决思路问题描述在使用阿里云MaxCompute查询sql时发现sql正常查询并返回数据但是查看日志时发现有报错信息2025-10-1620:16:44.907ERROR36832---[io-10111-exec-3]c.a.d.pool.DruidPooledPreparedStatement:getMaxFieldSize error java.sql.SQLFeatureNotSupportedException:nullat com.aliyun.odps.jdbc.OdpsStatement.getMaxFieldSize(OdpsStatement.java:438)at com.alibaba.druid.filter.FilterChainImpl.statement_getMaxFieldSize(FilterChainImpl.java:2915)at com.alibaba.druid.filter.FilterAdapter.statement_getMaxFieldSize(FilterAdapter.java:2562)at com.alibaba.druid.filter.FilterChainImpl.statement_getMaxFieldSize(FilterChainImpl.java:2913)at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.getMaxFieldSize(StatementProxyImpl.java:317)at com.alibaba.druid.pool.DruidPooledPreparedStatement.init(DruidPooledPreparedStatement.java:80)at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:359)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)...解决方法先说我这里的解决方法将配置文件数据源配置中的spring.datasource.dynamic.druid.pool-prepared-statements和max-pool-prepared-statement-per-connection-size注释掉因为pool-prepared-statements默认为false所以在启动项目调用接口就可以看到没有报错了。spring:datasource:primary:lakedynamic:#动态数据源配置druid:max-active:50initial-size:2max-wait:600000min-idle:2# pool-prepared-statements:true# max-pool-prepared-statement-per-connection-size:20time-between-eviction-runs-millis:60000min-evictable-idle-time-millis:300000validation-query:select1#也会对数据湖查询检查 test-while-idle:truetest-on-borrow:truetest-on-return:falsefilters:statconnectionProperties:druid.stat.mergeSqltruedatasource:lake:driverClassName:com.aliyun.odps.jdbc.OdpsDriverurl:jdbc:odps:https://xxx.maxcompute.aliyun-inc.com/api?projectxxxaccessIdxxxaccessKeyxxxinteractiveModetrueautoSelectLimit1000000druid:validation-query:我这里使用的是mybatis-plus的多数据源如果不想影响到其他的数据源也可以单独配置spring:datasource:primary:lakedynamic:#动态数据源配置druid:max-active:50initial-size:2max-wait:600000min-idle:2pool-prepared-statements:truemax-pool-prepared-statement-per-connection-size:20time-between-eviction-runs-millis:60000min-evictable-idle-time-millis:300000validation-query:select1#也会对数据湖查询检查 test-while-idle:truetest-on-borrow:truetest-on-return:falsefilters:statconnectionProperties:druid.stat.mergeSqltruedatasource:lake:driverClassName:com.aliyun.odps.jdbc.OdpsDriverurl:jdbc:odps:https://xxx.maxcompute.aliyun-inc.com/api?projectxxxaccessIdxxxaccessKeyxxxinteractiveModetrueautoSelectLimit1000000druid:#数据湖不做查询检测 validation-query:# 关闭预编译语句池化只针对lake数据源 pool-prepared-statements:falsemax-pool-prepared-statement-per-connection-size:0解决思路回到报错日志点击com.aliyun.odps.jdbc.OdpsStatement.getMaxFieldSize(OdpsStatement.java:438)可以看到OdpsStatement类实现Statement接口但是重写接口中的getMaxFieldSize()时是直接抛出一个异常。这里就可以想到只要让程序在执行时不走这个方法即可。继续向上追进入com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:359)。可以看到com.alibaba.druid.pool.DruidPooledConnection#prepareStatement(java.lang.String)这个方法是重写了java.sql.Connection#prepareStatement(java.lang.String)。而 DruidPooledConnection 是阿里巴巴 Druid 数据库连接池框架中的核心接口因此在配置文件中寻找将prepareStatement相关的两个配置注释执行代码时可以发现不会报错了。继续向上追最后会发现在com.alibaba.druid.pool.DruidPooledPreparedStatement#DruidPooledPreparedStatement中publicclassDruidPooledPreparedStatementextendsDruidPooledStatementimplementsPreparedStatement{...privatebooleanpooledfalse;publicDruidPooledPreparedStatement(DruidPooledConnectionconn,PreparedStatementHolderholder)throwsSQLException{...pooledconn.getConnectionHolder().isPoolPreparedStatements();// Remember the defaults//当spring.datasource.dynamic.datasource.ics-datalake.druid.pool-prepared-statementsfalse时不走预编译的相关代码从而解决执行代码报错问题if(pooled){try{defaultMaxFieldSizestmt.getMaxFieldSize();}catch(SQLExceptione){LOG.error(getMaxFieldSize error,e);}...}...}