JAVA在没有循环的情况下从数据库获取数据

时间:2013-02-03 06:17:57

标签: java oracle cursor fetch resultset

我正在使用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代码中:正如我之前提到的,我迭代resultset获取值,但是数据库的一面,即使我选择了值,为什么我应该使用循环来获取值?

(在.net框架中的另一个事实,有使用数据库绑定的概念。所以在java中的任何方式,绑定数据库程序,如.net的,没有迭代。 )

4 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

根据您要对该数据执行的操作以及频率,ref_cursor的选择可能是好的还是坏的。 Ref_cursors旨在为非Oracle感知程序提供传递数据的方法,以便进行报告。

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

请参阅Oracle® Database JDBC Developer's Guide and Reference

答案 2 :(得分:0)

答案 3 :(得分:0)

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