【问题标题】:JAVA Getting data from Database Without a loopJAVA从数据库中获取数据没有循环
【发布时间】:2013-01-18 03:57:34
【问题描述】:

我正在使用 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一样绑定数据库过程,而不需要迭代。 )

【问题讨论】:

  • 没有循环就没有办法做到这一点.. :-)
  • @Praneeth 您的意思是说您的结果集将始终从数据库返回一行,并且在这种情况下您不希望在这里,因为它是单行输出?实际上,RESULT-SET 将允许我们迭代从数据库返回的单行的列。如果返回多行,那么我们需要 while() 来迭代多行。
  • @ Kanagavelu Sugumar。谢谢你的评论。我知道,但我需要知道任何用于数据库过程绑定的技术,如 vb.net。它总是与数据库连接。所以 .net 开发人员不要需要一个循环来获取值。
  • 使用结果集可以让您逐一处理行,而使用 sys_refcursor 不会改变这一点 - 您仍然需要遍历该游标。但这并不意味着您对每一行都访问数据库;司机每次行程都会缓存一个或多个行。见setFetchSize。那么您认为会很慢,还是您现在有问题?
  • 您在循环中实际在做什么?如果您正在为用户呈现东西,那么您无能为力。如果您正在对数据进行处理(交叉引用、汇总、计算),那么您很可能可以将该处理推回数据库并大幅提高性能。

标签: java oracle cursor fetch resultset


【解决方案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 

【讨论】:

    【解决方案2】:

    【讨论】:

    • 但是,当获得一个 sys_refcursor。我需要一个循环来获取该对象
    • @Praneeth 如果你有多行,就无法避免循环。如果你想在没有手动的情况下将数据库映射到 java 对象,你必须使用一些框架,比如 ormlite。它会强制转换数据库行到 java 对象。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      Oracle® Database JDBC Developer's Guide and Reference

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多