【发布时间】:2022-10-02 00:23:26
【问题描述】:
我有一个基于 Java 的应用程序,我在其中发出使用 PreparedStatement 的查询。这些准备好的语句缓存在我的连接实现层中,然后根据驱逐例程被丢弃。
我偶然发现的问题是,如果我使用以下查询生成PreparedStatement:
SELECT FUNCTION(..) as A, T.* FROM table t WHERE ...
如果我稍后发出ALTER TABLE table ... 语句并且上述准备好的被重用,如果我在ALTER 中添加一个新列,则该列在准备好的语句的结果集中不可见。如果语句过期并因此被关闭,或者如果在ALTER 之后手动关闭语句并且我使用了新的准备好的语句,我会得到添加的新列。
我有几个问题:
- 谁能解释发生了什么,因为我没有观察到其他供应商的情况?
- 这种缓存是否使用
PreparedStatement控制在驱动程序或数据库级别? - 如果它在驱动程序级别,是否可以禁用此行为?
更新
我们使用以下驱动程序显式连接到 Linux 上的 IBM Db2 11.5 实例:<dependency> <groupId>com.ibm.db2</groupId> <artifactId>jcc</artifactId> <version>11.5.0.0</version> </dependency>