gpt4 book ai didi

java - 通过 jdbc 获取 Oracle DB LONG 类型的速度非常慢

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:12 25 4
gpt4 key购买 nike

只有当语句返回LONG列时才会发生这种情况。
即使我不做任何事情,比如 rs.getString,也只需执行。

sql1: That was: 7593 ms
sql2: That was: 530 ms

如您所见,这与数据量无关。
当我使用 OracleConnection:OracleStatement:OracleCachedResultSet 结果是相同的。
我还尝试使用 OracleCachedRowSet 而不是 ResultSet
问题出现在 OracleCachedRowSet.next() 之前的 OracleCachedRowSet.execute() 中。
当我设置 setFetchSize(1) 时:

sql1: That was: 7474 ms
sql2: That was: 7153 ms

更新1:
我测试过其他工具:

sql1# Toad For Oracle : execution time < 1 second
sql1# Oracle SQL Developer thin: 7.5 second(same as my result)
sql1# Oracle SQL Developer OCI: 7.5 second(same as my result)
sql2# Oracle SQL Developer thin: 0.36 second(same as my result)
Rows fethed one by one in sql1 case in java app, so look like setFetchSize() dosn't work.

示例代码:

public class Test {

public static void main(String[] args) throws SQLException {

final String sql1 = "select HIGH_VALUE from sys.DBA_TAB_PARTITIONS WHERE rownum < 20";
final String sql2 = "select PARTITION_NAME, HIGH_VALUE_LENGTH,TABLESPACE_NAME,NUM_ROWS,BLOCKS,\n"
+ "EMPTY_BLOCKS,LAST_ANALYZED,AVG_SPACE,SUBPARTITION_COUNT,COMPRESSION from sys.DBA_TAB_PARTITIONS WHERE rownum < 20";

OracleDataSource ods = new OracleDataSource();
ods.setDriverType("thin");
ods.setUser("vr");
ods.setPassword("oracle");
ods.setDatabaseName("ORCL");
ods.setServerName("192.172.18.1");
ods.setPortNumber(1521);

Connection conn = null;
conn = ods.getConnection();

Statement stmt = conn.createStatement();
stmt.setFetchSize(1000);

// Start time
long startTime = System.currentTimeMillis();

ResultSet rs = stmt.executeQuery(sql1);
rs.setFetchSize(1000);
while (rs.next()){
//System.out.println(rs.getString(1) + " " + rs.getString(2));
System.out.println("row#: " + rs.getRow());
}

// Finish time
long endTime = System.currentTimeMillis();
System.out.println("That was: " + (endTime - startTime) + " ms");
}
}

最佳答案

使用新的 ojdbc7.jar(在我使用 11.2.0.2 bundle 中的 ojdbc6.jar 之前)和 OracleJDBCRowSet 的结果。
19 行:

sql1 : That was: 1470 ms // before 7-8 seconds
sql2 : That was: 1140 ms

99 行:

sql1 : That was: 1491 ms
sql2 : That was: 1158 ms

正如您所看到的,它的速度要快得多,但仍然比查询更多数据要慢。
添加更多列几乎不会改变执行和获取时间,因此问题部分解决。
但似乎改进仅针对 RowSets。
OracleResultSet 的运行速度仍然非常慢。
此外,如果您将新驱动程序与 Oracle SQL Developer 链接,则不会产生任何效果。

示例代码:

public class Test {

public static void main(String[] args) {

final String sql1 = "select HIGH_VALUE from sys.DBA_TAB_PARTITIONS WHERE rownum < 100";
final String sql2 = "select PARTITION_NAME, HIGH_VALUE_LENGTH,TABLESPACE_NAME,NUM_ROWS,BLOCKS,\n"
+ "EMPTY_BLOCKS,LAST_ANALYZED,AVG_SPACE,SUBPARTITION_COUNT,COMPRESSION "
+ "from sys.DBA_TAB_PARTITIONS WHERE rownum < 100";

OracleDataSource ods = null;
try {
ods = new OracleDataSource();
} catch (SQLException ex) {
System.exit(2);
}
ods.setDriverType("thin");
ods.setUser("vr");
ods.setPassword("oracle");
ods.setDatabaseName("ORCL");
ods.setServerName("192.172.18.1");
ods.setPortNumber(1521);

try (Connection conn = ods.getConnection();) {
try (OracleJDBCRowSet rs = new OracleJDBCRowSet(conn);) {
rs.setFetchSize(200);
rs.setReadOnly(true);
rs.setCommand(sql2);

// Start time
long startTime = System.currentTimeMillis();

rs.execute();
while (rs.next()) {
System.out.println("row#: " + rs.getRow() + " " + rs.getString(1));
}

// Finish time
long endTime = System.currentTimeMillis();
System.out.println("That was: " + (endTime - startTime) + " ms");
}
} catch (SQLException e) {
System.err.println(e.getMessage());
}
}
}

关于java - 通过 jdbc 获取 Oracle DB LONG 类型的速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26882021/

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