news 2026/7/16 18:37:50

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用阿里云的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.mergeSql=truedatasource:lake:driverClassName:com.aliyun.odps.jdbc.OdpsDriverurl:jdbc:odps:https://xxx.maxcompute.aliyun-inc.com/api?project=xxx&accessId=xxx&accessKey=xxx&interactiveMode=true&autoSelectLimit=1000000druid: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.mergeSql=truedatasource:lake:driverClassName:com.aliyun.odps.jdbc.OdpsDriverurl:jdbc:odps:https://xxx.maxcompute.aliyun-inc.com/api?project=xxx&accessId=xxx&accessKey=xxx&interactiveMode=true&autoSelectLimit=1000000druid:#数据湖不做查询检测 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{...privatebooleanpooled=false;publicDruidPooledPreparedStatement(DruidPooledConnectionconn,PreparedStatementHolderholder)throwsSQLException{...pooled=conn.getConnectionHolder().isPoolPreparedStatements();// Remember the defaults//当spring.datasource.dynamic.datasource.ics-datalake.druid.pool-prepared-statements=false时不走预编译的相关代码,从而解决执行代码报错问题if(pooled){try{defaultMaxFieldSize=stmt.getMaxFieldSize();}catch(SQLExceptione){LOG.error("getMaxFieldSize error",e);}...}...}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 18:36:19

NeuroRebuild驱动的评标现场镜像孪生三维重构与全息智管平台

NeuroRebuild驱动的评标现场镜像孪生三维重构与全息智管平台一、行业背景与核心痛点公共资源交易中心、政府采购及工程招投标交易场所的评标专区&#xff0c;属于高度保密、强公平性、全流程审计的封闭管控空间&#xff0c;包含多间独立评标室、隔夜评标用房、评标走廊、候评区…

作者头像 李华
网站建设 2026/7/16 18:32:43

Easy-Query性能优化指南:让你的数据库查询快10倍

Easy-Query性能优化指南&#xff1a;让你的数据库查询快10倍 【免费下载链接】easy-query java/kotlin high performance lightweight solution for jdbc query,support oltp and olap query,一款java下面支持强类型、轻量级、高性能的ORM,致力于解决jdbc查询,拥有对象模型筛选…

作者头像 李华
网站建设 2026/7/16 18:31:17

【小程序毕业设计】民宿线上订房小程序的设计与实现 基于 SpringBoot + 微信小程序的民宿房源管理预约系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/16 18:31:16

tRPC.panel()源码解析:React组件与tRPC路由解析的实现指南

tRPC.panel()源码解析&#xff1a;React组件与tRPC路由解析的实现指南 【免费下载链接】trpc-panel 项目地址: https://gitcode.com/gh_mirrors/tr/trpc-panel 想要快速了解和测试你的tRPC API吗&#xff1f;tRPC.panel()为你提供了一个完美的解决方案&#xff01;这个…

作者头像 李华
网站建设 2026/7/16 18:24:58

Mysql会产生几种日志

MySQL的日志按所属层级划分&#xff0c;‌共有7种核心日志‌&#xff0c;分为Server层和InnoDB引擎层两大类&#xff1a;‌Server层日志&#xff08;5种&#xff09;‌错误日志&#xff1a;记录启动、运行、停止的错误警告&#xff0c;默认开启&#xff0c;用于排查故障。二进制…

作者头像 李华
网站建设 2026/7/16 18:24:34

170、多任务联合学习:超分与去噪、去模糊的协同训练框架设计

170、多任务联合学习:超分与去噪、去模糊的协同训练框架设计 上周调一个超分模型,输入是手机拍的夜景照片,结果模型把噪点当纹理给放大了,输出画面像砂纸一样。更离谱的是,有一张轻微运动模糊的图,模型居然把模糊边缘“脑补”成了锯齿状伪影。这让我意识到,现实场景中的…

作者头像 李华