Удалить GlimpseDbConnection, когда Glimpse отключен

Я использую Glimpse.ADO для профилирования команд Linq to SQL, используя следующий код:

var connection = new SqlConnection(connectionString);
var conn = new GlimpseDbConnection(connection);
context = new ApplicationDatabaseDataContext(conn, mappingSource);

Приведенный выше код работает нормально, и я вижу SQL-запросы в HUD.

Я хотел бы отключить Glimpse в рабочей среде, поэтому я использую следующий код в файле web.config.

<glimpse defaultRuntimePolicy="Off">

Однако я хотел бы удалить GlimpseDbConnection, чтобы предотвратить ненужное влияние на производительность при мониторинге каждого запроса. В идеале я мог бы сделать что-то вроде:

if (Glimpse.Enabled)
{
    var connection = new SqlConnection(connectionString);
    var conn = new GlimpseDbConnection(connection);
    context = new ApplicationDatabaseDataContext(conn, mappingSource);
}
else
{
    context = new ApplicationDatabaseDataContext(connectionString, mappingSource);
}

Очевидно, Glimpse.Enabled не существует, но есть ли способ сделать что-то подобное?


person Dan Rowlands    schedule 17.10.2013    source источник


Ответы (2)


Честно говоря, я бы не рекомендовал проверять, включен ли Glimpse (в этой ситуации).

Вместо этого используйте DbProviderFactories ADO.NET, к которому Glimpse может прозрачно подключиться.

Вот пример:

var connectionString = ConfigurationManager.ConnectionStrings["YourConnectionString"];
var factory = DbProviderFactories.GetFactory(connectionString.ProviderName);  

using (DbCommand cmd = factory.CreateCommand())
{ 
    // work with cmd
    using (DbConnection con = factory.CreateConnection())
    {
        // work with con
    } 
}

Glimpse будет автоматически работать с этим кодом, когда он включен, и автоматически не будет мешать, когда он отключен — лучшее из обоих миров!

person nikmd23    schedule 22.10.2013
comment
Используя этот подход, я вижу, что даже с ‹glimpse defaultRuntimePolicy=Off›, типом 'con' во время отладки по-прежнему является Glimpse.Ado.AlternateType.GlimpseDbConnection. Разве это не должен быть запрошенный провайдер (например, System.Data.SqlClient.SqlConnection) без оболочки glimpse в этом случае? - person maartendekker; 18.02.2014

Даже если бы вы могли это сделать, вы должны принять во внимание, что Glimpse включен или нет для конкретного запроса — это то, что переоценивается, пока ваш запрос проходит через конвейер обработки запросов. Это означает, что Glimpse может быть включен в начале запроса, пока вы выполняете проверки, а в конце запроса Glimpse отключается из-за какой-то политики.

Но в вашем случае при отключении Glimpse в конфиге, то он будет отключен с самого начала. После отключения всегда отключается для этого запроса, обратное не всегда верно.

С другой стороны, влияние на производительность незначительно по сравнению со временем, необходимым для открытия соединения и выполнения запроса.

При этом вы всегда можете использовать следующий хакерский подход, но нет никаких гарантий, что он продолжит работать с новым выпуском.

Glimpse сохраняет это текущее состояние в коллекции Items текущего HttpContext, поэтому, если вы можете получить текущий HttpContext, вы можете использовать следующий код для выполнения условной проверки.

public static class CurrentGlimpseStatus
{
    private const string GlimpseCurrentRuntimePolicyKey = "__GlimpseRequestRuntimePermissions";

    public static bool IsEnabled
    {
        get
        {
            RuntimePolicy currentRuntimePolicy = RuntimePolicy.Off;
            if (System.Web.HttpContext.Current.Items.Contains(GlimpseCurrentRuntimePolicyKey))
            {
                currentRuntimePolicy = (RuntimePolicy)System.Web.HttpContext.Current.Items[GlimpseCurrentRuntimePolicyKey];
            }

            return !currentRuntimePolicy.HasFlag(RuntimePolicy.Off);
        }
    }
}
person cgijbels    schedule 17.10.2013