Dapper orm 버퍼링되지 않은 스트림에서 oracle nclob을 닫지 않았습니다. 쿼리

dapper oracle

문제

데이터베이스의 열 중 하나에 oracle nclob를 사용하는 동시에 8 백만 행의 "buffered : false"를 선택하면 항상 메모리가 부족합니다.

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
            }
        }
    }
}

우리는 이것이 버그라고 믿지만, 우리가 놓친 부분이 있습니까?

수락 된 답변

Dapper는 특정 제공 업체에 대해 많이 알 필요가 없도록 매우 열심히 노력합니다. 나는 네 사건에서 단지 다음과 같은 일을하고 있다고 생각한다.

obj.YourClobMember = reader.GetValue(8);

여기에있는 문제는 실제로, 그것이 대담한 사람에 의해 결코 처형되지 않을 것이라는 것입니다. 이 시나리오 에서 가장 좋은 방법은 루프에서 호출 하는 정리 메서드 를 사용 하는 것이고 clob 멤버가 null이 아닌지 확인하고 그렇게 처리하면 null로 할당하는 것입니다. 이것은 행 타입을 IDisposable 로 만들 수도 있습니다.

또한 사용자 정의 유형 핸들러와 관련된 것이있을 수 있지만 여기에 명백한 유형이 byte[] 일 수 있다는 사실은 이미 어렵게 처리되어 있으므로 어색하게 만듭니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow