0

我需要为 FetchSize 赋值。可以使用反射从数据读取器接收行大小。

但是我需要行数,我可以将其硬编码为行大小 * 100000(而不是行数)。

executedataReader 将用于多个存储过程,无法获取行数。

            OracleDataReader dr = command.ExecuteReader();

            Int32 rowCount = 100000; //in this case actual result will be just 20k only. will it have any issue?

            FieldInfo fi = dr.GetType().GetField("m_rowSize", BindingFlags.Instance | BindingFlags.NonPublic);

            Int32 rowSize = Convert.ToInt32(fi.GetValue(dr));

            dr.FetchSize = rowCount * rowSize;

            while (dr.Read())
            {
                string myField = (string)dr[0];
                Console.WriteLine(myField);
            }

解决这个问题会有什么弊端吗?

4

1 回答 1

3

此处的FetchSize属性限制为单个“提取”分配回数据库的内存量。较小的获取大小意味着获取数据的往返次数更多,但也意味着在任何给定时间客户端上使用的内存更少。

将获取大小设置为类似的值RowSize * n会告诉读者一次总是获取最多 n行。如果设置n为等于,RowCount则表示“一次获取整个结果集”。如果你设置n为一个固定的数字,你说的是“一次取我 1000(或 10000 或 25000 或其他)行”。当您调用DataReader.Read()时,数据读取器将尝试返回它已经获取并缓存的行。如果您要求它一次获取 100,000 行,它只需要每 100,000 次Read()调用与 Oracle 对话一次。

更大的获取大小将意味着更有效的网络流量,更少的数据库访问,因此在大多数情况下通常会“更快”。但是,这意味着客户端使用的内存相对较多,因此如果获取大小变得非常大,您可能会遇到垃圾收集和/或分页问题。随你(由你决定。

请注意,分配FetchSize一个不是行大小倍数的值是完全合法的,它只会导致每次提取时未使用一些剩余内存。如果您对Command具有不同行大小的多个存储过程使用相同的对象,则最好只设置一个较大的FetchSize值(以实际字节为单位)并将其用于所有内容。

于 2012-07-20T13:52:15.817 回答