gpt4 book ai didi

java - 如何提高使用 Spring 将 REF CURSOR 检索到 Java 中的性能?

转载 作者:行者123 更新时间:2023-11-30 09:32:29 32 4
gpt4 key购买 nike

我正在执行对作为数据库包一部分的函数的调用。此包部署在两个位置。一个是本地的,另一个是远程的(跨越大西洋)。

我正在通过 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... 上转到数据库吗?有更好的方法吗?

提前致谢。

最佳答案

rs.getString("name")

ResultSet.get*(String columnName) 可以替换为 ResultSet.get*(int columnNaumber) 这稍微快一点,但我怀疑这里的主要问题。

Is this because it's going to the DB on every rs.get... ?

虽然这真的取决于驱动程序,但我怀疑它不会。对于缓存的结果集,当您滚动光标时,它可能会转到那里的服务器,但它仍然会在每次往返中获取一堆行。

我还有两个建议:

  • 使用网络嗅探工具查看正在传输的数据
  • 检查您的驱动程序是否有预取等选项。

关于java - 如何提高使用 Spring 将 REF CURSOR 检索到 Java 中的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12517136/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com