C# 使用.Net从Oracle数据库读取数据的速度是使用Java的10倍

C# 使用.Net从Oracle数据库读取数据的速度是使用Java的10倍,c#,java,.net,oracle,C#,Java,.net,Oracle,我正在使用.Net和Java从Oracle数据库读取1百万条记录。 在.Net中,我在Java ojdbc6瘦客户机中使用ODP.Net。 在.Net中读取数据大约需要10秒,而在Java中几乎需要2分钟。 为什么会有如此巨大的差异 下面是一个代码: .Net: 爪哇: 编辑:setFetchSize()完成了这项工作,谢谢。在Java中,默认情况下,结果集被完全检索并存储在内存中。这不适用于具有大型结果集的查询。要使用流式结果,必须使用: stmt = conn.createStatement

我正在使用.Net和Java从Oracle数据库读取1百万条记录。 在.Net中,我在Java ojdbc6瘦客户机中使用ODP.Net。 在.Net中读取数据大约需要10秒,而在Java中几乎需要2分钟。 为什么会有如此巨大的差异

下面是一个代码:

.Net:

爪哇:


编辑:setFetchSize()完成了这项工作,谢谢。

在Java中,默认情况下,结果集被完全检索并存储在内存中。这不适用于具有大型结果集的查询。要使用流式结果,必须使用:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

我没有比较所用的时间,但我想这会快得多。

根据我的经验,Oracle JDBC驱动程序在质量传输方面的开箱即用配置很差。默认情况下,它一次只能通过网络传输10条记录。因此,如果您有1000000条记录,驱动程序将导致100000次网络访问

您可以告诉
ResultSet
使用此代码一次提取多少条记录:

result.setFetchSize(1000);

您可以随意尝试不同的尺寸。它极大地减少了我所处理过的至少一个应用程序的处理时间(从几分钟到几秒钟)。

猜测一下:在java中,您使用的只是一个具有“任意级别”的JDBC驱动程序,在.net中使用的是一个专门的本机客户端。。。但是,一般来说,.net更快;)我认为你是从一个有缺陷的前提开始的:Java可以很快。你确定结果集被完全检索并存储在内存中吗?这是JDBC标准的一部分,还是您在一些JDBC驱动程序上观察到的这种行为?我也会尝试一下,但不要打赌。。。或者您可以测试将数据加载到.Net中的数据集中,循环它,看看是否也需要2分钟。很有意思知道…@Adam是的,我确定。正如你所猜测的,这是JDBC驱动程序的默认行为。@PC:我错了,我误解了你的答案。我以为你是在建议司机一次性转移整个结果集。谢谢你的提示。我忘了缓冲。
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
result.setFetchSize(1000);