超时时间已到。-在ServiceStack Service中使用Db

卡勒姆·瓦斯

Db在ServiceStack服务中使用该属性访问数据库,但是我时不时地从IIS中收到以下错误:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

堆栈跟踪:

[InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.]
   System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +6371713
   System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +6372046
   System.Data.SqlClient.SqlConnection.Open() +300
   ServiceStack.OrmLite.OrmLiteConnection.Open() +44
   ServiceStack.OrmLite.OrmLiteConnectionFactory.OpenDbConnection() +132
   ServiceStack.ServiceInterface.Service.get_Db() +68

我已ReuseScopeConfigure方法中设置了ReuseScope.None我认为应该根据每个请求关闭连接方法我在这里做错了什么?

public override void Configure(Container container)
{
    JsConfig.EmitCamelCaseNames = true;

    //Register all your dependencies
    ConfigureDb(container);

    //Set MVC to use the same Funq IOC as ServiceStack
    ControllerBuilder.Current.SetControllerFactory(new FunqControllerFactory(container));
}

ConfigureDb:

private static void ConfigureDb(Container container)
{
    var connectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;
    container.Register<IDbConnectionFactory>(c =>
        new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider))
        .ReusedWithin(ReuseScope.None);

    using (var db = container.Resolve<IDbConnectionFactory>().Open())
    {
      // Do database seed/initialisation
    }
}

编辑

经过更多诊断后,调用此服务方法多次刷新页面时,似乎会发生这种情况:

public Warranty Get(Warranty request)
    {
        var warranty = new Warranty();
        if (request.Id != default(int))
        {
            warranty = Db.Id<Warranty>(request.Id);
            warranty.WarrantyOrder = ResolveService<WarrantyOrderService>().Get(new WarrantyOrder { WarrantyId = warranty.Id });
            warranty.WarrantyStatus = ResolveService<WarrantyStatusService>().Get(new WarrantyStatus { Id = warranty.StatusId });
            warranty.WarrantyNotes = ResolveService<WarrantyNoteService>().Get(new WarrantyNotes { WarrantyId = warranty.Id });
            warranty.WarrantyDialogues = ResolveService<WarrantyDialogueService>().Get(new WarrantyDialogues { WarrantyId = warranty.Id });
            warranty.WarrantyCredit = ResolveService<WarrantyCreditService>().Get(new WarrantyCredit { WarrantyId = warranty.Id });
            warranty.WarrantyPhotos = ResolveService<WarrantyPhotoService>().Get(new WarrantyPhotos { WarrantyReference = warranty.WarrantyReference });
            warranty.WarrantyReport = ResolveService<WarrantyReportService>().Get(new WarrantyReport { WarrantyId = warranty.Id });
        }

        return warranty;
    }

我已经ConfigureDb按照下面的@mythz答案进行了更改

    private static void ConfigureDb(Container container)
    {
        var connectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;
        container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
    }

该服务需要调用其他服务以在我的Warranty对象上填充其他对象,我不确定如何改进它?

神话

IDbConnectionFactory像所有的连接管理器是线程安全的工厂创建数据库连接,也就是说,它不是一个DB连接本身。它应该注册为单例。

默认情况下,ServiceStack的IOC(Funq)默认情况下注册为Singleton,因此正确的注册如下:

container.Register<IDbConnectionFactory>(c =>
    new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));

解决服务

由于ServiceStack Services具有利用托管资源的潜力,因此每当从另一个服务中解析它们时都应在using语句中使用它们,以便对其进行适当处置,例如:

using (var orders = ResolveService<WarrantyOrderService>())
using (var status = ResolveService<WarrantyStatusService>())
{
    var warranty = new Warranty { 
        WarrantyOrder = orders.Get(new WarrantyOrder { WarrantyId = warranty.Id }),
        WarrantyStatus = status.Get(new WarrantyStatus { 
            WarrantyId = warranty.StatusId }),
       //etc
    }       

    return warranty; 
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ServiceStack.Client超时

来自分类Dev

超时时间已到。从池中获取连接之前已经过超时时间。

来自分类Dev

超时时间已到。从池中获取连接之前已经经过了超时时间。

来自分类Dev

如何使用Intern设置功能测试的超时时间?

来自分类Dev

如何使用UniRx Observable.Timeout设置超时时间?

来自分类Dev

如何使用 Nautilus 延长 SFTP 连接的超时时间?

来自分类Dev

超时时间已到。在操作完成之前超时时间已过,或者服务器没有响应。”

来自分类Dev

Visual Studio Community 2013卸载-由于超时时间已到期,因此返回此操作

来自分类Dev

ServiceStack-超时已到期,原因是最大应用程序池大小

来自分类Dev

ServiceStack PooledRedisClient超时异常

来自分类Dev

如何使用ServiceStack.OrmLite全局更改命令超时

来自分类Dev

如何使用ServiceStack.OrmLite全局更改命令超时

来自分类Dev

如何设置使用django发送电子邮件的超时时间?

来自分类Dev

使用电池或交流电时设置不同的黑屏超时时间

来自分类Dev

使用Watson的音频分析器时如何延长超时时间

来自分类Dev

如何使用 Python 和 Windows 设置下载 YouTube 视频音频的超时时间

来自分类Dev

连接超时已过期。尝试使用登录前握手确认时经过的超时时间

来自分类Dev

连接超时已过期。尝试使用登录前握手确认时经过的超时时间

来自分类Dev

设置超时时间

来自分类Dev

Cookie超时时间

来自分类Dev

从ServiceStack Service清除JSON

来自分类Dev

ServiceStack Redis重试超时异常

来自分类Dev

使用Servicestack传递JSON

来自分类Dev

使用ServiceStack实施WebHooks

来自分类Dev

使用RedisMQ设计ServiceStack

来自分类Dev

将默认令牌超时时间更改为可在身份服务器 4 中配置而不使用 cookie

来自分类常见问题

更改排球超时时间

来自分类Dev

在MVC中使用ServiceStack Funq依赖注入

来自分类Dev

在ServiceStack中使用wsdl soap服务

Related 相关文章

  1. 1

    使用ServiceStack.Client超时

  2. 2

    超时时间已到。从池中获取连接之前已经过超时时间。

  3. 3

    超时时间已到。从池中获取连接之前已经经过了超时时间。

  4. 4

    如何使用Intern设置功能测试的超时时间?

  5. 5

    如何使用UniRx Observable.Timeout设置超时时间?

  6. 6

    如何使用 Nautilus 延长 SFTP 连接的超时时间?

  7. 7

    超时时间已到。在操作完成之前超时时间已过,或者服务器没有响应。”

  8. 8

    Visual Studio Community 2013卸载-由于超时时间已到期,因此返回此操作

  9. 9

    ServiceStack-超时已到期,原因是最大应用程序池大小

  10. 10

    ServiceStack PooledRedisClient超时异常

  11. 11

    如何使用ServiceStack.OrmLite全局更改命令超时

  12. 12

    如何使用ServiceStack.OrmLite全局更改命令超时

  13. 13

    如何设置使用django发送电子邮件的超时时间?

  14. 14

    使用电池或交流电时设置不同的黑屏超时时间

  15. 15

    使用Watson的音频分析器时如何延长超时时间

  16. 16

    如何使用 Python 和 Windows 设置下载 YouTube 视频音频的超时时间

  17. 17

    连接超时已过期。尝试使用登录前握手确认时经过的超时时间

  18. 18

    连接超时已过期。尝试使用登录前握手确认时经过的超时时间

  19. 19

    设置超时时间

  20. 20

    Cookie超时时间

  21. 21

    从ServiceStack Service清除JSON

  22. 22

    ServiceStack Redis重试超时异常

  23. 23

    使用Servicestack传递JSON

  24. 24

    使用ServiceStack实施WebHooks

  25. 25

    使用RedisMQ设计ServiceStack

  26. 26

    将默认令牌超时时间更改为可在身份服务器 4 中配置而不使用 cookie

  27. 27

    更改排球超时时间

  28. 28

    在MVC中使用ServiceStack Funq依赖注入

  29. 29

    在ServiceStack中使用wsdl soap服务

热门标签

归档