2016-01-26 4 views
1

Я обновляю большие объемы данных, используя OrmLite ServiceStack с подключением к PostgreSQL, однако я получаю большое количество тайм-аутов.ServiceStack OrmLite и PostgreSQL - тайм-ауты

Пример кода:

public class AccountService : Service 
{ 
    public object Any(ImportAccounts request) 
    { 
     var sourceAccountService = this.ResolveService<SourceAccountService(); 
     var sourceAccounts = (GetSourceAccountResponse)sourceAccountService.Get(new GetSourceAccounts()); 

     foreach (var a in sourceAccounts) 
     { 
      Db.Save(a.ConvertTo<Account>()); 
     } 


    } 
} 

Служба счета Источник, который находится в том же проекте & получает доступ к той же Дб.

public class SourceAccountService : Service 
    { 
     public object Get(GetSourceAccounts request) 
     { 
      return new GetSourceAccountsResponse { Result = Db.Select<SourceAccounts>().ToList() }; 
     } 
    } 

Вопросы,

  1. Должен ли я ожидать большого количества времени ожидания с учетом выше настройки?

  2. Лучше использовать с помощью (IDbConnection db = DbFactory.OpenDbConnection()) вместо Db?

ответ

2

Если вы разрешения и выполнения службы вы должны сделать это в использовании оператора так, чтобы его открытая Db связь и другие ресурсы надлежащим образом утилизировать:

using (var service = this.ResolveService<SourceAccountService()) 
{ 
    var sourceAccounts = service.Get(new GetSourceAccounts()); 
    foreach (var a in sourceAccounts) 
    { 
     Db.Save(a.ConvertTo<Account>()); 
    } 
} 

Если вы выполнения другие услуги, лучше указать тип возврата на службе для дополнительной безопасности типа и пониженный котел пластины на каждом месте вызова, например:

public class SourceAccountService : Service 
{ 
    public GetSourceAccountsResponse Get(GetSourceAccounts request) 
    { 
     return new GetSourceAccountsResponse { 
      Result = Db.Select<SourceAccounts>() 
     }; 
    } 
} 

Note: Db.Select<T> returns a List so .ToList() is unnecessary,

Другой альтернативой для выполнения службы вместо ResolveService<T> является использование:

var sourceAccounts = (GetSourceAccountsResponse)base.ExecuteRequest(new GetSourceAccounts()); 

Что же выше, и выполняет службы в пределах using {}.

+0

При попытке base.ExecuteRequest, я получаю сообщение об ошибке: исключение типа «System.NotImplementedException» произошло в ServiceStack.dll, но не был обработан в пользовательском коде Дополнительная информация: Не удалось найти метод, названный Post (GetSourceAccounts) или Любые (GetSourceAccounts) в службе SourceAccountService. –

+0

Я предполагаю, что мне нужно перейти от публичного объекта Get (GetSourceAccounts запрос) к общедоступному объекту Any (запрос GetSourceAccounts)? –

+0

@MarkH Да, должно быть, сообщение или любое. – mythz