Java JDBC - Oracle11g Sys Ref Cursor与pl / sql集合

时间:2015-10-28 13:51:51

标签: java jdbc collections oracle11g sys-refcursor

我想问专家们有什么建议从Java应用程序(使用JDBC)从oracle 11g数据库中获取3000-5000条记录。我们的标准是始终调用存储过程。

我做了一些研究,发现ref cursor基于JDBC fetch count属性多次往返数据库。 (在处理ref游标时,有人可以更多地了解oracle和JVM中数据存储在内存中的端到端流程

我认为集合更有效率,因为数据从oracle db一次性发送到调用者(Java)(使用批量收集)。通过这种方法,我们可以避免从Java到Oracle服务器的多个网络调用。这是一个真实的假设吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这是一个比任何人愿意在帖子中承诺的更大的话题。这是一个讨论如何Oracle manages read consistency的链接。整个页面可能是一个很好的阅读,以了解服务器中发生了什么。还有一篇文章here讨论了使用集合发生的事情。如何将集合返回到JDBC客户端(不是我曾尝试过的)?

从本质上讲,从数据库的配置方式到网络调整到磁盘性能的方式,再到客户端性能等,都会涉及很多性能。

简短的回答是你需要尝试一下。检索3-5k记录并不是很多,这取决于记录的大小,即您通过网络返回的记录。如果它们是20字节记录,并且您的网络(MTU?)大小是4k块,则可以在块中容纳大约200条记录。在某些时候,你会遇到收益递减规律。

我习惯使用存储过程,但你不需要。这取决于查询的复杂性(表的数量和连接的类型)以及像DBA这样的人能够进入并查看查询正在执行的操作的能力。

担心网络出行并不那么重要,因为只有这么多数据可以包含在数据包中。无论你使用什么,都会有很多网络旅行,这取决于你的用例,以确定将其降到最低限度的重要性。