gpt4 book ai didi

c# - 服务堆栈 : Detect if IDbConnection is "busy" - is a DataReader is open (trying to implement a "connection pool")

转载 作者:可可西里 更新时间:2023-11-01 08:33:32 30 4
gpt4 key购买 nike

我正在测试 ServiceStacks OrmLite。我以前在没有 OrmLite 的情况下使用过 MySql,现在我遇到了此错误消息中描述的最简单的问题:

There is already an open DataReader associated with this Connection which must be closed first.

由于我有一个多线程应用程序,某些线程将轮询数据库,而其他线程将在需要时“按需”插入、更新或选择。这会导致上述异常。

我需要做的是能够检测连接(IDbHandler)是否“忙”;有一个打开的 DataReader 或其他东西。如果忙,则取下一个连接(来 self 要实现的“连接池”)。问题是,我无法在 IDbHandler 对象中使用任何方法或属性来确定它是否忙碌。

我已经在“正常”的 mysql 情况下解决了这个问题,只需使用一种方法,我可以在其中发送 MySqlCommand 或仅发送查询字符串,例如:

dbConnections.ExecuteQuery("SELECT * FROM test");
dbConnections.ExecuteQuery(cmd); // cmd == MySqlCommand

并且 ExecuteQuery 将处理找到一个打开的连接并在那里传递 cmd/查询。

但是,由于我使用的是 OrmLite,它有很多 IDbConnection 扩展方法,我不想为每个方法都创建“代理方法”。在上面的简单 mysql 案例中,实际上只需要一个方法,它接收 MySqlCommand,但 OrmLite 中的许多方法并非如此。

第一个问题:

  • 如何检测连接是否繁忙?我想避免 try-catch 情况来检测它。

第二个问题:

  • 有没有办法传递整个“方法”调用,例如:

例子:

dbConnections.Run(iDbHandler.Select<MyObject>(q => q.Id > 10));
// or
dbConnections.Run(iDbHandler.Where<MyObject>(q => q.Id > 10));
// or
dbConnections.Run(iDbHandler.SomeOtherWeirdMetod<MyObject>(q => bla bla bla));

最佳答案

到目前为止,这不是最好的解决方案,但这是我正在测试的一种方法,以了解它如何处理我的特定情况(当前版本为 3.97)。和 Ted 一样,我经常看到开放数据读取器异常,或者连接被返回为已关闭。

在我的使用中,所有服务都继承了我的父服务(它又继承了服务),该服务处理一些常见的元数据处理。我已选择让我的基本服务覆盖服务的 Db 属性并快速检查 Db 连接的状态并尝试恢复。立即修复的一个案例如下:

我的 MsSql 服务器正在故障转移群集中运行。当SQL Server从节点A切换到节点B时,我在ServiceStack中没有找到内置机制来检测其内存连接“脏”并需要重新连接。

欢迎提出意见和改进。

public override System.Data.IDbConnection Db
{
get
{
try
{
var d = base.Db;
if (d == null || d.State != System.Data.ConnectionState.Open)
return ForceNewDbConn();
else
return d;
}
catch (Exception ex)
{
return ForceNewDbConn();
//throw;
}
}
}

private IDbConnection ForceNewDbConn()
{
try
{
var f = TryResolve<IDbConnectionFactory>();
if (f as OrmLiteConnectionFactory != null)
{
var fac = f as OrmLiteConnectionFactory;
fac.AutoDisposeConnection = true;
var newDBconn = fac.Open();
return newDBconn;
}
return base.Db;
}
catch (Exception ex)
{
throw;
}
}

关于c# - 服务堆栈 : Detect if IDbConnection is "busy" - is a DataReader is open (trying to implement a "connection pool"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19905437/

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