LINQ를 통해 Varbinary 데이터로 행에 액세스하면 타임 아웃이 발생합니까? 어떻게 고치는 지?

StackOverflow https://stackoverflow.com/questions/1171104

문제

SQL에는 여러 테이블이 있습니다. 하나는 통제 수단 (일반적인 크루드 종류의 객체) 그리고 하나는 첨부 파일. 첨부 파일 참조 통제 수단 FK를 통해 (많은 첨부 파일이있을 수 있음). 첨부 파일 또한 파일 데이터가 포함 된 이름과 varbinary 열이 포함됩니다.

LINQ를 통해 제어 첨부 파일 속성이 있습니다.

기존 첨부 파일 목록을 포함하여 많은 정보를 표시하는 Controls View (MVC)가 있습니다. 해당 목록은 도우미 방법을 통해 수행됩니다.

public static string FileBox(this HtmlHelper helper, string name, IEnumerable<Models.Attachment> files, bool writable)
    { ... }

이 함수는 첨부 파일을 통해 반복하고 첨부 파일 이름이있는 순서가없는 목록을 작성합니다.

드물게 타임 아웃 오류가 발생하고 여기에 그 오류가 있습니다.

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

...

at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
   at System.Data.Linq.EntitySet`1.Load()
   at System.Data.Linq.EntitySet`1.GetEnumerator()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at IRSoxCompliance.Helpers.Html.FileBox(HtmlHelper helper, String name, IEnumerable`1 files, Boolean writable) in C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\IRSoxCompliance\IRSoxCompliance\IRSoxCompliance\Helpers\Html.cs:line 228
   at ASP.views_edit_control_edit_test_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\inetpub\wwwroot\Views\Edit\Control_Edit_Test.aspx:line 109

...

그래서...

  1. 이 타임 아웃은 제어가 이미로드되었지만 첨부 파일 행은 게으른로드되어 있으며 도우미에서만 적재됩니까? 그리고 이것은 주로 내가 필요하지 않은 50MB의 데이터를 잡고 있다는 사실 때문입니까?

  2. 이것을 어떻게 방지합니까? a) 테이블을 분할하지 않고 싶습니다. b) 바이너리를 제외한 모든 것을 갖는 새로운 클래스를 반환하는 컨트롤에 부착물 부분 속성을 만들 수 있습니까? c) 바이너리 열에서 '지연로드'를 켤 수 있습니다. 이것이 효과가 있습니까? 그렇다면 테이블을 지우고 다시로드하는 습관이 있기 때문에 DBML에서 아무것도 변경하지 않는 점으로 만들었습니다. 그래서 나는이 설정을 잃을 것입니다. 내가 잃지 않도록 할 수있는 방법이 있습니까? 부분에서 설정할 수 있습니까? 아니면 그것이 켜져 있다고 주장 할 수있는 단위 테스트일까요?

해결책: 답을 바탕으로, 나는 다음과 같이 깨달았습니다.

foreach (Attachment file in controls.Attachments) {
  response.write(file.name);
}

대신 할 수 있습니다 :

foreach (string filename in controls.Attachments.Select(a => a.name)) {
  response.write(filename);
}

Varbinary 열을 연기로로드했지만 DBML 파일을 재설정 해야하는 옵션을 다시 설정하는 것을 잊지 않기를 바라고 있습니다.

감사합니다, 제임스

도움이 되었습니까?

해결책

  1. LINQ가 게으른 부착물을로드하고 있다는 것이 옳습니다. 데이터베이스에서 varbinary 데이터를 드래그하는지 여부는 쿼리에 따라 다릅니다. 게시 할 수 있습니까?

  2. 문제를 해결하기 위해 데이터베이스의 구조를 변경할 필요가 없습니다. 쿼리가 varbinary 필드에 닿지 않도록하십시오.이를 보장하려면 적절한 선택/프로젝션이 필요합니다. 또한 항상 컨트롤러와 관련된 모든 첨부 파일을 얻을 것이라는 것을 알고 있다면 LINQ에 LINQ에 게으른로드를 요구하는 대신 한 번에 모든 것을 얻도록 지시 할 수 있습니다. 이렇게하면 작업을 완료하는 데 필요한 데이터베이스 라운드 트립의 수가 줄어 듭니다.

MSDN에 대한 정보와 함께로드

또한 테이블에서 인덱스가 괜찮은지 확인할 가치가 있습니다.

데이터베이스에서 Point SQL 쿼리 분석기에 대한 실제 통찰력을 얻은 다음 코드를 실행하십시오. SQL이 데이터베이스에 닿은 SQL이 정확히 데이터베이스에 도달하고 관리 스튜디오에서 가져 와서 실행하여 어떤 데이터가 다시 끌리는 지 정확히 확인할 수 있습니다.

이것이 조금 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top