【问题标题】:ServiceStack OrmLite and PostgreSQL - timeoutsServiceStack OrmLite 和 PostgreSQL - 超时
【发布时间】:2016-01-26 16:05:51
【问题描述】:

我正在使用 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>());
        }


    }
}

Source Account 服务,位于同一个项目中并访问同一个 Db。

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

问题,

  1. 考虑到上述设置,我是否应该期待大量超时?

  2. 使用 (IDbConnection db = DbFactory.OpenDbConnection()) 代替 Db 更好吗?

【问题讨论】:

    标签: postgresql ormlite-servicestack


    【解决方案1】:

    如果您正在解析和执行服务,您应该在 using 语句中执行此操作,以便打开 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>()
            };
        }
    }
    

    注意:Db.Select&lt;T&gt; 返回一个列表,所以.ToList() 是不必要的,

    执行服务而不是ResolveService&lt;T&gt; 的另一种方法是使用:

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

    与上述相同,在using {} 中执行服务。

    【讨论】:

    • 尝试 base.ExecuteRequest 时出现错误:ServiceStack.dll 中出现“System.NotImplementedException”类型的异常,但未在用户代码中处理其他信息:找不到名为 Post(服务 SourceAccountService 上的 GetSourceAccounts) 或 Any(GetSourceAccounts)。
    • 我想我需要从公共对象 Get(GetSourceAccounts request) 更改为公共对象 Any(GetSourceAccounts request)?
    • @MarkH Yep 需要是 Post 或 Any。
    • 感谢成功!!!而且没有更多的超时!一如既往地感谢您的出色反馈!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多