C#으로 작성된 라이브러리를 다시 작성하여 시작이 완료된 후에도 할당이 이루어지지 않도록했습니다.할당이없는 .NET DB 쿼리?
방금 OdbcConnection을 통해 30 초마다 일부 DB 쿼리를 수행하는 프로젝트가 있습니다. 난 항상 .ExecuteReader()를 사용하여 OdbcDataReader를 생성했습니다. 자신의 OdbcDataReader를 재사용 할 수있는 패턴 (예 : SocketAsyncEventArgs 소켓 패턴)이 있습니까? 또는 할당을 피하는 다른 영리한 방법?
직장에서 사용하는 모든 dbs가 오라클 기반이고 내가 마지막으로 점검 한 LINQ에 대한 공식적인 Linq가 없었기 때문에 나는 LINQ를 배우는 데 신경 쓰지 않았습니다. 그러나 Linq에서이 작업을 수행 할 수있는 방법이 있다면 제 3의 작업 중 하나를 사용할 수 있습니다.
는 업데이트 :나는 분명히 노 ALLOC의 요구 사항에 대한 이유를 지정 생각하지 않습니다. 우리는 하나의 중요한 스레드를 실행하고 그것은 매우 동결하지 않는 것이 중요합니다. 이것은 거의 실시간 거래 응용 프로그램을위한 것이며 일부 Gen 2 모음의 경우 최대 100 밀리 초 동결 상태입니다. (나는 또한 게임이 C#에서 같은 방식으로 쓰여졌다 고 들었다.) 30 초마다 준수 검사를 수행하고 실행하는 백그라운드 스레드가 하나 있습니다. 지금 db 쿼리를 수행합니다. 쿼리는 매우 느립니다 (모든 데이터를 반환하는 데 약 500 밀리 초).하지만 중요한 스레드와 간섭하지 않기 때문에 괜찮습니다. 작업자 스레드가 메모리를 할당하는 경우를 제외하고 모든 스레드를 정지시키는 GC가 발생합니다.
저는이 라이브러리를 포함한 모든 라이브러리가 시작 후에 메모리를 할당 할 수 없다고 들었습니다. 제가 동의하든 그렇지 않든, 수표에 서명하는 사람들의 요구 사항입니다. :).
이제 할당없이이 프로세스에 데이터를 가져올 수있는 방법이 있습니다. 다른 프로세스를 설정하고 소켓을 사용하여이 프로세스에 연결할 수 있습니다. 새로운 .NET 3.5 소켓은 새로운 SocketAsyncEventArgs 패턴을 사용하여 전혀 할당하지 않도록 특별히 최적화되었습니다. 실제로 우리는 여러 시스템에 연결하기 위해 이들을 사용하고 있습니다. 그런 다음 소켓에서 읽고 데이터를 거쳐 문자열을 할당하지 않는 미리 할당 된 바이트 배열을 가지고 있습니다. (나는 .NET의 다른 형태의 IPC에 익숙하지 않아 메모리 매핑 파일과 명명 된 파이프가 할당되는지 여부를 잘 모르겠습니다.)
그러나 이러한 번거 로움없이이 no-alloc 쿼리를 수행하는 더 빠른 방법이 있다면, 나는 그것을 선호합니다.
30 초마다 ... 이렇게 길게 배정 된 배정의 효과가 매우 낮다는 것을 알 수 있습니다. – Dykam
흠, 할당이 없습니다. 먼저 dbase 테이블에서 모든 문자열을 제거하십시오. 완료되면 다시 돌아와 문제 # 2에서 50까지 해결할 수 있습니다. 결국 C++로 전환해야합니다. –