0

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

除了数据库负载增加并且查询花费更长的时间之外,升级后的所有内容都可以正常工作。堆栈是 Hibernate 3.6.10、Postgres 9.1 和 Spring 2.5.4 / 3.0。升级前/升级后唯一不同的是 spring jars 和 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'

生成这些查询的代码来自休眠条件,并且作为 Spring 升级的一部分,该代码没有更改。

在我的休眠配置中是这样的:

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

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

4

1 回答 1

1

嗯,好的。事实证明,作为升级的一部分,我删除了一个 jar,其中包含一些 postgres 驱动程序(以及其他特定于项目的垃圾)。

它可能包含对标准驱动程序的自定义扩展,用于将这些选择中的每一个包装在游标中,尽管很难说没有源:( 在任何情况下,将该 jar 放回类路径会使其返回所需的行为。

于 2013-01-15T23:43:06.747 回答