我们正在使用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
}
}
}
}
我们认为这是一个错误,但有些东西我们只是缺失了吗?
答案 0 :(得分:1)
Dapper非常努力,不需要了解具体的提供商。我怀疑在你的情况下它只是相当于:
obj.YourClobMember = reader.GetValue(8);
这里的问题确实是,它永远不会被精致的人所处理。我建议在这种情况下,你最好的选择是有一个你从循环调用的清理方法,检查clob成员是否为null,并且如果是,则处理并将其指定为null。这甚至可以通过使您的行类型IDisposable
。
可能还有一些涉及自定义类型处理程序的事情,但事实上这里显而易见的类型可能是byte[]
,这使得它很尴尬,因为它已经有了顽固的处理。