java - 使用 Spring 3 生成在 Postgres 中使用游标的 sql

标签 java spring hibernate postgresql

我有 java webapp,已从 spring 2.5.x 升级到 spring 3.x。

升级后一切正常,只是数据库负载增加且查询时间更长。该堆栈是 Hibernate 3.6.10、Postgres 9.1 和 Spring 2.5.4/3.0。升级前/升级后唯一不同的是 spring jar 和 deps。

我发现在较旧(较快)的 spring 2 设置下生成的查询使用游标返回结果,而较新(较慢)的 spring 3 设置则生成不使用游标的查询。

例如:

LOG:  statement: DECLARE JDBC_CURS_660 CURSOR FOR select distinct virtualfle0_.VIRTUAL_FLEET_ID as VIRTUAL1_58_, virtualfle0_.CSO_ID as CSO2_58_, virtualfle0_.VIRTUAL_FLEET_NAME as VIRTUAL3_58_, virtualfle0_.SCHEDULE_ID as SCHEDULE4_58_ from EG_VIRTUAL_FLEET virtualfle0_ where (virtualfle0_.CSO_ID=2 ) limit 40; FETCH FORWARD 100 FROM JDBC_CURS_660

LOG:  execute S_158/C_159: select distinct virtualfle0_.VIRTUAL_FLEET_ID as VIRTUAL1_58_, virtualfle0_.CSO_ID as CSO2_58_, virtualfle0_.VIRTUAL_FLEET_NAME as VIRTUAL3_58_, virtualfle0_.SCHEDULE_ID as SCHEDULE4_58_ from EG_VIRTUAL_FLEET virtualfle0_ where (virtualfle0_.CSO_ID=$1 ) limit $2
DETAIL:  parameters: $1 = '2', $2 = '40'

生成这些查询的代码来自 hibernate 标准,并且该代码在 Spring 升级过程中并未发生更改。

我的 hibernate 配置是这样的:

<property name="hibernate.jdbc.fetch_size">100</property>
<property name="hibernate.jdbc.batch_size">100</property>

所以我的问题是,如何让 spring 3 生成使用游标的正确 sql?

最佳答案

呃,好吧。事实证明,我在升级过程中删除了一个 jar,其中包含一些 postgres 驱动程序内容(以及其他特定于项目的垃圾)。

它可能包含标准驱动程序的自定义扩展,用于将每个选择包装在光标中,尽管如果没有源代码就很难说:(无论如何,将该 jar 放回到类路径上会将其返回到所需的位置行为。

关于java - 使用 Spring 3 生成在 Postgres 中使用游标的 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347236/

相关文章:

java - 将两个构造函数简化为一个

java - 如何在 Spring 中处理多个文件和消息以实现国际化?

java.lang.IllegalArgumentException : The region 'eu-west-2' is not a valid region

hibernate - 获取具有特定权限的人员-带有Grails的 Spring 安全

java - Hibernate 不创建 Java 类。我能做些什么?

java - 输入不匹配异常?我还是想不通

java - Hibernate @NamedNativeQuery 读取 "normal"实体写入的陈旧数据持久化

java - 无法使用 Maven 执行 Junit5 测试

java - Spring Integration TCP 连接工厂 SSL - 使用 java keystore

sql - Sybase ASE 15 + hibernate : SybSQLException when using quotes in queries