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

时间:2013-01-15 21:26:45

标签: 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 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升级过程中没有改变。

在我的hibernate配置中是:

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

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

1 个答案:

答案 0 :(得分:1)

好的,好的。事实证明,作为升级的一部分,我删除了一个jar,其中有一些postgres驱动程序的东西(在其他项目特定的垃圾中)。

它可能包含标准驱动程序的自定义扩展,用于将每个选项包装在游标中,但如果没有源代码则很难说:(无论如何,将该jar放回类路径返回这是必要的行为。