gpt4 book ai didi

servicestack - 超时已过。 - 在 ServiceStack 服务中使用 Db

转载 作者:行者123 更新时间:2023-12-04 14:59:25 24 4
gpt4 key购买 nike

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

配置数据库:
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像所有连接管理器一样是线程安全的 工厂创建数据库连接,即它本身不是数据库连接。它应该被注册为单例。

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

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

解析服务

由于 ServiceStack 服务具有利用托管资源的潜力,因此无论何时从另一个服务解析它们,都应该在 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;
}

关于servicestack - 超时已过。 - 在 ServiceStack 服务中使用 Db,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19927765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com