ServiceStack OrmLite 和 PostgreSQL - 超时

ServiceStack OrmLite and PostgreSQL - timeouts

我正在使用 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. 使用 using (IDbConnection db = DbFactory.OpenDbConnection()) 而不是 Db 更好吗?

如果您正在解析和执行服务,您应该在 using 语句中执行它,以便打开 Db 连接和 其他资源妥善处理:

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

如果您正在执行其他服务,最好在服务上指定 Return 类型以增加类型安全性 并在每个呼叫站点减少样板,例如:

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

内执行服务