Dapper orm不在无缓冲的流上关闭oracle nclob .Query <t>

时间:2016-06-29 17:40:18

标签: oracle dapper

我们正在使用oracle nclob作为我们数据库中的一个列,而在执行“buffered:false”选择的800万行时,我们总是会耗尽内存。

using (var connection = new OracleConnection(_databaseConfiguration.ConnectionString))
{
    connection.Open();
    var result = connection.Query<ClassWithNClob>(query, param, buffered: false);

    foreach (var element in result)
    {
        //do something with element that has a nclob
    }
}

我们通过使用默认的OracleDataReader解决了这个问题,当我们想要访问nclob时,我们用using语句包装它。我们想使用Dapper,因为它会使转换变得更加简单,但目前还不能。

using (var connection = new OracleConnection(_databaseConfiguration.ConnectionString))
{
    connection.Open();
    var command = new OracleCommand(query,connection);    
    using (OracleDataReader oraReader = oracleCommand.ExecuteReader())
    {
        while(oraReader.Read())
        {
            using(var blobStream = reader.GetOracleClob(2))
            {
                //something with bloblStream.Value
            }
        }
    }
}

我们认为这是一个错误,但有些东西我们只是缺失了吗?

1 个答案:

答案 0 :(得分:1)

Dapper非常努力,不需要了解具体的提供商。我怀疑在你的情况下它只是相当于:

obj.YourClobMember = reader.GetValue(8);

这里的问题确实是,它永远不会被精致的人所处理。我建议在这种情况下,你最好的选择是有一个你从循环调用的清理方法,检查clob成员是否为null,并且如果是,则处理并将其指定为null。这甚至可以通过使您的行类型IDisposable

可能还有一些涉及自定义类型处理程序的事情,但事实上这里显而易见的类型可能是byte[],这使得它很尴尬,因为它已经有了顽固的处理。