Oracle字段扩容后java.sql.ResultSet返回裁剪字符串问题咨询
问题根因
该问题由WebLogic 12的JDBC连接池默认机制导致,和应用代码、Spring框架配置无关:
- WebLogic JDBC数据源默认开启表结构元数据缓存,应用首次查询
alpha表时,连接池会将该表的字段类型、长度等元数据缓存到内存,后续所有查询都会复用这份缓存的元数据,无需每次查询都重复拉取表结构。 - 你执行
ALTER TABLE alpha MODIFY data VARCHAR2(6);扩容字段后,连接池的元数据缓存没有同步更新,JDBC驱动读取java.sql.ResultSet时仍然按照旧的VARCHAR2(5)长度规则截断字符串,因此只能拿到前5位字符。 last_update字段返回正常,是因为你没有修改该字段的结构,缓存的元数据和实际表结构完全一致,不存在截断逻辑。- 第三方SQL客户端查询正常,是因为这些客户端没有复用WebLogic的连接池缓存,每次查询都会直接拉取数据库最新的表结构元数据。
解决方案
临时生效(无需重启应用/服务)
登录WebLogic管理控制台,找到应用使用的对应JDBC数据源,进入高级设置页,点击重置数据源按钮即可:该操作会清空当前连接池的所有空闲连接、以及关联的元数据缓存,新创建的连接会主动拉取最新的表结构元数据,查询即可返回完整的6位字符。
永久避免同类问题
如果业务场景需要频繁修改表结构,可以调整数据源配置关闭元数据缓存:
- 在对应JDBC数据源的
高级设置页,取消勾选缓存结果集元数据选项,或者将元数据缓存大小设置为0。 - 注意:关闭元数据缓存会轻微提升查询时的数据库交互开销,生产环境如果很少修改表结构,不建议长期关闭,每次修改表结构后手动重置数据源即可。
异常排查
如果重置数据源后问题仍然存在,可排查以下两点:
- 确认应用是否配置了ORM框架二级缓存,如有需要清空对应缓存。
- 确认
NamedParameterJdbcDaoSupport是否配置了自定义结果集映射缓存,如有需要更新映射规则。
内容的提问来源于stack exchange,提问作者Mas
相关产品推荐
相关产品推荐

