2011-08-23 2 views
1

oracle 데이터베이스에서 읽는 프로젝트를 수행하고 있습니다. Silverlight RIA를 사용하고 DomainService를 자동 생성 했으므로 데이터 표시에 대해 걱정할 필요가 없으므로 구조화에 너무 신경을 쓰지 않습니다.Silverlight RIA 테이블에 2 백만 행이있는 DomainService

내 질문은 XAML에서 domaindatasource를 사용하고 WCF 서비스 및 해당 호출을 디버깅하는 데 fiddler를 사용하면 useraccounts 테이블의 첫 번째 데이터 집합에 200 만 개의 행이 포함되고 DomainService가 시간 초과됩니다. .

는 지금은 20 분에 서비스의 제한 시간을 증가 시도,하지만 여전히 아무 소용이, 나는 오류 얻을 :

로드 작업이 쿼리 "GETUA_USERACCOUNTS"실패를. HTTP 요청이 alloted 시간 초과를 초과했습니다.

또한 내가 사용하는 총 9 개의 테이블 중 3 개의 테이블에 약 200 만 개의 행이 있는데,이 문제에 접근하는 가장 좋은 방법은 무엇입니까?

+0

뒤에 코드에서 필요에 따라

public IQueryable<FWCUser> UpdateFWCUserWithUserProfileID(int userProfileID, int fwcUserID) { return this.ObjectContext.UpdateFWCUserWithUserProfileID(userProfileID, fwcUserID).AsQueryable(); } 
  • 는 방법을 프로젝트를 빌드하고 호출합니다. 데이터 표시에 페이징/필터링을 추가 했습니까? –

  • +0

    안녕하십니까, 모든 데이터를 표시 할 필요가 없다는 사실을 잊어 버렸습니다. 클라이언트 측에서 현재 레코드를 찾아야합니다. 사용자가 userID를 입력하면 다양한 테이블에서 userId에 대한 모든 정보를 가져오고 3 개의 테이블에 200 만 개의 행이 있으므로 시간 초과가 발생합니다. – Red

    +0

    Silverlight 클라이언트 응용 프로그램으로 바로 전송하려면 많은 데이터가 필요합니다. 이는 Silverlight와 서비스 끝점간에 여러 요청이 필요한 경우에도 서버 측에서 수행하려는 작업처럼 들릴 수 있습니다. – avanek

    답변

    0

    계속하고, 빨간색 (Psuedocode)

    public IQueriable<UserDTO> GetUserAccountDetails(string UserID) 
    { 
        DataSet oneBazillionRows = SQLServer.GetAllUserRows(); 
    
        // LINQ to the rescue 
        return from user in oneBillionRows 
          where user.ID = UserID; 
    } 
    

    와 comsumer 결과를 반환하기 전에, 서버에서 데이터 필터링/처리를 수행 질문 :

    public void GetUserInfo() 
    { 
        ServiceContext context = new ServiceContext(); 
        context.Load<UserDTO>(ServiceContext.GetUserAccountDetailsQuery(), load => 
        { 
         // do some work here 
         //like signalling the call is complete 
         // or storing the data in your View Model 
        }, null); 
    } 
    

    그러면 고객은 하나의 데이터 행만 수신합니다. 기본 형태는 지금과 같다 :

    public IQueriable<ReturnType> WebService(Parameter parameter, ...) 
    { 
        // Do all your work here, return minimal results 
    } 
    

    고려 : 불변의 단절은 클라이언트 시스템보다 훨씬 beefier에 될 것입니다. 필터링/정렬/전처리 결과의 모든 작업을 수행하고 최소한의 데이터 만 전달하도록합니다. RIA 구현이 훨씬 더 기뻐할 것입니다.

    +0

    도움을 주셔서 감사합니다, 당신이 suggessted로 노력할 것입니다. 환호 – Red

    0

    당신은있는 DataPager를 사용해야 여기를 참조 : http://www.silverlightshow.net/items/Creating-applications-with-.NET-RIA-Services-Part-4-Adding-a-DomainDataSource.aspx

    <navigation:Page x:Class="WebAdministrationTool.ManageUsers" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:ria="clr-namespace:System.Windows.Controls;assembly=System.Windows.Ria.Controls" 
        xmlns:local="..." 
        xmlns:validation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm"> 
    
        <Grid x:Name="LayoutRoot"> 
    
         <data:DataGrid x:Name="UsersGrid" 
             IsReadOnly="True" 
             AutoGenerateColumns="True" 
             ItemsSource="{Binding Data, ElementName=MyDataSource}" /> 
    
         <validation:DataPager x:Name="UsersPager" 
               PageSize="10" 
               Source="{Binding Data, ElementName=MyDataSource}" /> 
    
         <ria:DomainDataSource x:Name="MyDataSource" LoadMethodName="LoadHugeAmountOfRows"> 
          <ria:DomainDataSource.DomainContext> 
           <local:MyDomainContext /> 
          </ria:DomainDataSource.DomainContext> 
         </ria:DomainDataSource> 
    
        </Grid> 
    
    </navigation:Page> 
    
    +0

    답장을 보내 주셔서 감사합니다. 실제로 모든 데이터를 표시하지는 않습니다. 테이블에있는 2 백만 개의 레코드 중 실제 레코드에서 현재 레코드를 찾아야합니다. 이걸 어떻게 처리할까요? – Red

    +0

    FilterDescriptor를 DomainDataSource에 추가해야합니다. 여기에 샘플 구현을 참조하십시오. http://msdn.microsoft.com/en-us/library/system.windows.controls.domaindatasource.filterdescriptors%28VS.91%29.aspx – DenisPostu

    +0

    DenisPostu에게 다시 한 번 감사드립니다. 더 명확한 질문. 제가 여기있는 Situtation은 .. 모든 데이터를 표시 할 필요가 없다는 것을 잊어 버렸습니다. 클라이언트 측에서 현재 레코드를 찾아야합니다. 사용자가 userID를 입력 한 다음 여러 테이블에서 userId에 대한 모든 정보를 가져오고 3 개의 테이블에 200 만 개의 행이 있으므로 시간 초과가 발생합니다. – Red

    1

    가 ToTraceString 방법을 사용 ...

    http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

    ... 또는 오라클 프로파일 링 도구를 SQL 문을 결정하기 위해 사용 중이며 실행하는 데 시간이 오래 걸립니다.

    속도를 높이기 위해 인덱스를 추가하는 것과 같은 쿼리 최적화 기술을 사용하십시오.

    또는 필요한 결과를보다 효율적으로 반환하는 저장 프로 시저를 작성하십시오. 톰톰이 중단 된

    +0

    도움을 주신 Scott 께 감사드립니다. 제안대로 시도해 보시고 앞으로 어떻게 될지에 대해 다시 알려 드리겠습니다. . – Red

    0

    나는이 문제를 처리하기 위해 데이터베이스에 저장된 프로 시저를 작성하여 작업을 수행하고 필요한 정보 만 다시 작성합니다. RIA에 저장 프로 시저를 추가하는 것에 대한 많은 정보는 없지만 여기서 내가 알고있는 것에 대한 정보가 있습니다.

    1. 클릭하고 기능 가져 오기를 추가 바로 모델 브라우저에서 저장 프로 시저
    2. 을 포함하는 프로젝트에 저장 프로 시저
    3. 갱신하여 데이터베이스 모델을 만들 수 있습니다. 여기에서 이름을 지정하고 데이터가 반환되는 방식을 결정합니다. 자신이 쉽게 만들고 DomainService.metadata에 이미있는 개체를 반환하려고합니다.cs 파일)
    4. 새 반환 개체를 만드는 경우 도메인 서비스의 DomainService.metadata.cs 파일에
    5. 을 추가하면 결과 목록을 반환하는 public 메서드를 추가합니다. 클라이언트 응용 프로그램은 모두 200 만 개 기록을 필요가 없습니다해야

      FWCDomainContext context = new FWCDomainContext(); 
      context.Load(context.UpdateFWCUserWithUserProfileIDQuery(num1, num2), Completed, null); 
      
    +0

    도와 주셔서 감사합니다. 정말 고맙습니다. 건배 – Red

    관련 문제