1

我正在使用 JAVA 编写软件并使用 Oracle DB。

通常我们使用循环从数据库中获取值

Resultset rt = (Resultset) cs.getObject(1);

while(rt.next){
    ....
}

但是从数据库中获取数千条数据时听起来会更慢。

我的问题是:

在 Oracle DB 中:我创建了一个像这样的过程,它是迭代数据并分配给游标。

Ex.procedure test_pro(sysref_cursor out info) as

open info select * from user_tbl ......

end test_pro;

在 JAVA 代码中:正如我之前提到的,我迭代了一个resultsetfor 获取值,但是在数据库方面,即使我选择了值,为什么要使用循环来获取这些值?

(另一个事实在 .net 框架中,有使用数据库绑定的概念。Java 中的任何方式也是如此,绑定数据库过程,如 .net 的,无需迭代。)

4

4 回答 4

1

如果您确定总会有一个结果,就像在这种情况下,您甚至可以跳过 if 并只调用 rs.next() 一次:

例如 :

ResultSet resultset = statement.executeQuery("SELECT MAX (custID) FROM customer");  
resultset.next(); // exactly one result so allowed  
int max = resultset.getInt(1); // use indexed retrieval since the column has no name 
于 2013-02-03T06:22:26.327 回答
1

根据您要对该数据执行的操作和频率,对 ref_cursor 的选择可能是好是坏。Ref_cursors 旨在为非 Oracle 感知程序提供一种传递数据的方式,以用于报告目的。

在你的情况下,坚持循环,但不要忘记实现数组获取,因为这对性能有巨大的影响。数据库将行块传递到客户端的 jdbc 缓冲区,您的代码从该缓冲区获取行。当你到达缓冲区的末尾时,Jdbc 层会从数据库中请求下一组行,从而消除大量的网络往返。默认已经一次获取 10 行。对于较大的集合,如果内存可以提供空间,请使用更大的数字。

请参阅Oracle® 数据库 JDBC 开发人员指南和参考

于 2013-02-03T17:42:14.060 回答
0

是的,你可以在java中调用过程。 http://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/

于 2013-02-03T06:22:54.550 回答
0

你无法避免循环。出于性能原因,您需要调整对 Statement 或 Resultset 对象的预取(100 是一个可靠的起点)。
为什么要这样做?它类似于读取流——你永远不知道它有多大——所以你一个接一个地按块/缓冲区读取......

于 2013-02-03T14:08:56.440 回答