我正在执行对作为 DB 包一部分的函数的调用。该软件包部署在两个位置。一个本地和另一个远程(横跨大西洋)。
我正在通过 Spring JDBC 模板检索数据。
有一个函数返回大约 1000 行(不是那么多),在本地获取数据时大约需要 1.5 秒,但在远程获取数据时大约需要 12 秒。
在所有示例代码中,名称都已更改,代码已稍微简化。
请查看当前 Java 代码的示例:
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(getDataSource())
.withSchemaName(MY_SCHEMA_NAME)
.withCatalogName("REFCURSOR_PKG")
.withFunctionName("GET_DATA")
.returningResultSet("RESULT_SET", new DataEntryMapper());
SqlParameterSource params = new MapSqlParameterSource()
.addValue("the_name", name)
.addValue("the_rev", rev);
Map resultSet = simpleJdbcCall.execute(params);
ArrayList list = (ArrayList) resultSet.get("RESULT_SET");
RowMapper 类看起来像这样:
class RouteDataEntryMapper implements RowMapper {
public RouteDataEntry mapRow(ResultSet resultSet, int rowNum) throws SQLException {
return new DataEntry(resultSet.getString("name"),
Integer.parseInt(resultSet.getString("rev"));
}
}
SQL 包规范片段:
TYPE REF_CURSOR IS REF CURSOR;
SQL函数:
FUNCTION GET_ROUTE_DATA(the_name VARCHAR2, the_rev VARCHAR2) RETURN REF_CURSOR AS
RESULT_SET REF_CURSOR;
BEGIN
OPEN RESULT_SET FOR
select *
from table_name tn
where tn.name = the_name
and tn.rev = the_rev;
RETURN RESULT_SET;
CLOSE RESULT_SET;
EXCEPTION WHEN OTHERS THEN
RAISE;
END GET_ROUTE_DATA;
我也尝试过使用常规样板 JDBC(创建连接、准备语句、执行语句、从 RESULT_SET 检索数据等),我发现绝大多数时间都花在循环 RESULT_SET 并将数据从中提取并放入一些pojos。在上面的 Spring 代码的情况下,大部分时间都花在了 execute() 方法中,但这可能是因为它当时使用 RowMapper 创建了对象。
因此,它们之间的共同领域是执行以下操作:
rs.getString("name")
我猜这就是问题所在,但我可能是错的。
正如我所说,本地延迟很好,但远程延迟太长了。这是因为它会在每个 rs.get... 上进入数据库吗?有一个更好的方法吗?
提前致谢。