尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

使用阿里云的MaxCompute查询sql时报错:DruidPooledPreparedStatement: getMaxFieldSize error
📅 发布时间:2026/7/16 18:39:00

文章目录

  • 问题描述
  • 解决方法
  • 解决思路

问题描述

在使用阿里云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);}...}...}

相关新闻

  • 测试内容与发布时间记录
  • 揭秘mlx-community/gemma-4-31b-it-mxfp4的核心技术:MXFP4量化如何实现高效推理
  • ET框架深度解析:如何构建高性能分布式游戏通信系统的5个关键技术

最新新闻

  • 重庆劳力士回收价格查询及各大回收平台实测排行(2026年7月最新数据) - 收的高名表回收平台
  • jpa-spec vs 传统JPQL:为什么说动态查询框架能提升开发效率300%?
  • PS4 11.00系统漏洞利用技术深度解析:jailbreak-11实验性工具架构与实现原理
  • Gemma-4-e4b-it-mxfp8未来展望:多模态AI的发展趋势与路线图
  • kylin-user-guide完全解析:UKUI桌面环境必备的文本指南工具
  • NURBS-Python API详解:自定义几何操作与算法扩展手册

日新闻

  • Toon Boom Harmony 高效工作流:从节点视图到镜头标记的实战技巧
  • 真力时售后维修电话,为您提供专业腕表保养与故障修复服务权威公示(2026年7月最新) - 亨得利官方服务中心
  • 【C++】类和对象--构造函数进阶(初始化列表与explicit)

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号