我正在使用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的,没有迭代。 )
答案 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行。对于较大的集合,如果内存可以提供空间,则使用更大的数字。
答案 2 :(得分:0)
是的,你可以在java中调用procedure。 http://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/
答案 3 :(得分:0)
你无法避免循环。出于性能原因,您需要调整Statement或Resultset对象上的预取(100是一个可靠的起点) 为什么这样做?它类似于读取流 - 你永远不知道它有多大 - 所以你一个接一个地读取块/缓冲区......