1

在我们的应用程序中可用的使用 SimpleJdbcTemplate 的 oracle SQL 查询永远不会(几乎)出现。查询很长,连接了近 15 个表,选择了大约 100 个字段等等。

查询将近 8500 个字符,使用 MapSqlParameterSource 实例添加了 6 个绑定变量)。我已经在 Row Mapper 方法调用中放置了足够多的日志消息,尽管这些消息从未被打印出来。

用实际值替换绑定变量后的相同 SQL 查询在 SQL*Plus 和 SQL Developer 中会在 5-7 秒内产生结果。结果只有 15 条记录,因为我使用该逻辑在 SQL 查询本身中实现分页支持。

我尝试了 JDBCTemplate 和 SimpleJdbcTemplate。任何想法可能出了什么问题?

更新 ::

我能够缩小问题的范围。我的查询包含一个同义词,因为 LEFT OUTER JOIN(它引用了不同的模式表)正在减慢整个查询的速度。当我将此连接与绑定变量一起使用时,就会发生这种情况。当我在 SQL Developer 和 SQL*Plus 中硬编码绑定变量的值时,查询运行良好。但是当我使用绑定变量时,同样的事情(挂起情况)也发生在这些工具中。

目前我指的是以下链接来纠正我的 dblink/同义词使用, Getting a ResultSet/RefCursor over a database link

谢谢,

4

1 回答 1

1

如果您在两种不同的连接方法之间有不同的性能,请确保它们不会改变会话优化器设置。

也许您的 jdbc 代码以某种方式指定了 optmizer 模式,因此当您通过 sqlplus 连接时形式不同。

alter session set OPTIMIZER_MODE = RULE;
alter session set OPTIMIZER_MODE = choose;

我在我们的环境中也遇到了这样的问题,所以我确保所有连接都使用相同的优化设置。

于 2013-04-23T07:59:17.123 回答