ormlite-servicestack,C#,Mysql,ormlite Servicestack" /> ormlite-servicestack,C#,Mysql,ormlite Servicestack" />

C# ServiceStack:检测IDbConnection是否为;忙碌";"数据读取器是否打开(尝试实现“连接池”)

C# ServiceStack:检测IDbConnection是否为;忙碌";"数据读取器是否打开(尝试实现“连接池”),c#,mysql,ormlite-servicestack,C#,Mysql,ormlite Servicestack,我正在测试ServiceStacks或MLite。我以前在没有OrmLite的情况下使用过MySql,现在我遇到了这个错误消息中最容易描述的问题: 已存在与此连接关联的打开的DataReader 必须先关闭它 由于我有一个多线程应用程序,某些线程将轮询数据库,而其他线程将在需要时插入、更新或选择“按需”。这导致了上述例外情况 我需要做的是能够检测连接(IDbHandler)是否“繁忙”;有一个开放的DataReader或其他类似的东西。如果忙,则进行下一个连接(从我要实现的“连接池”中)。问题是

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

已存在与此连接关联的打开的DataReader 必须先关闭它

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

我需要做的是能够检测连接(IDbHandler)是否“繁忙”;有一个开放的DataReader或其他类似的东西。如果忙,则进行下一个连接(从我要实现的“连接池”中)。问题是,IDbHandler对象中没有方法或属性可用于确定它是否忙

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

dbConnections.ExecuteQuery("SELECT * FROM test");
dbConnections.ExecuteQuery(cmd); // cmd == MySqlCommand
ExecuteQuery将处理查找打开的连接并在那里传递cmd/query

但是,因为我使用的是OrmLite,所以它有很多扩展IDbConnection的方法,我不想为每种方法创建“代理方法”。在上面简单的mysql示例中,实际上只需要一个方法,即接受MySqlCommand,但对于OrmLite中的许多方法,情况并非如此

第一个问题:

  • 如何检测连接是否繁忙?我想避免尝试捕捉的情况来检测它
第二个问题:

  • 是否有某种方法可以传递整个“方法”调用,例如:
例如:

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));
dbConnections.Run(idbdhandler.Select(q=>q.Id>10));
//或
Run(iDbHandler.Where(q=>q.Id>10));
//或
Run(idbdhandler.SomeOtherWeirdMetod(q=>blablablabla));

这并不是最好的解决方案,但我正在测试这种方法,看看它如何处理我的特定案例(目前在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;
    }
}
public override System.Data.IDbConnection Db
{
得到
{
尝试
{
var d=基.Db;
if(d==null | | d.State!=System.Data.ConnectionState.Open)
返回ForceNewDbConn();
其他的
返回d;
}
捕获(例外情况除外)
{
返回ForceNewDbConn();
//投掷;
}
}
}
专用IDBConnewDBconn()连接
{
尝试
{
var f=TryResolve();
if(f作为OrmLiteConnectionFactory!=null)
{
var fac=f,作为OrmLiteConnectionFactory;
fac.AutoDisposeConnection=true;
var newDBconn=fac.Open();
返回newDBconn;
}
返回base.Db;
}
捕获(例外情况除外)
{
投掷;
}
}

为什么不依赖内置连接池?哪一个是,我在哪里可以找到有关它的信息等?我也有这个problem@usr您有关于“内置连接池”的任何信息吗?因为我找不到任何关于它的信息…它是SQL Server ADO.NET类的内置。每个连接器实现自己的池。我确信MySQL/NET也有池,因为没有池的数据库连接器处于可怕的劣势。(让我猜猜——您最初是Java或C开发人员?)。