ADO.NET – MARS


Multiple Active Result Sets (MARS) é uma das grandes novidades do ADO.NET 2.0. Essa funcionalidade permite múltiplos batches no banco de dados com apenas uma única conexão, algo que não era possível nas versões anteriores do ADO.NET.

Quando precisamos recuperar múltiplos result-sets no ADO.NET 1.x através de um objeto do tipo SqlDataReader, uma conexão exclusiva deve ser utilizada (anexada) para cada objeto SqlCommand. O MARS vem para evitar a criação de N conexões (geralmente com o mesmo servidor/base de dados) para recuperar múltiplos conjuntos de dados.

Vale lembrar que o MARS não permite a execução paralela de comandos, pois as queries são executadas de forma sequencial. Se você precisar da execução paralela em algum momento da sua aplicação, terá que considerar o uso de múltiplas conexões ao invés de utilizar MARS.

Por padrão, o MARS vem habilitado no SQL Server 2005, mas você pode configurá-lo caso não queira utilizá-lo. Para que possamos configurá-lo, definimos na string de conexão com a base de dados, marcando a propriedade MultipleActiveResultSets para True (ou False se quiser desabilitá-lo). O exemplo abaixo mostra como fica a string de conexão com o MARS habilitado:

"integrated security=SSPI;data source=localhost;
    initial catalog=Northwind;MultipleActiveResultSets=True"

Outro ponto importante do MARS é a questão do pool de conexões: habilitado o MARS ou não, a conexão é colocada em pool, mas elas não são consideradas iguais. Os pools de conexões são criados de acordo com a string de conexão; isso quer dizer que strings de conexões diferentes tem pools diferentes. Se abrimos duas conexões, uma delas com o MARS habilitado e outra não, quando elas forem devolvidas para o pool, cada uma delas ficará armazenada em um local diferente.

Para vermos o MARS em funcionamento, vamos analisar o seguinte cenário: temos duas tabelas na base de dados: Pedidos e Items do Pedido. Temos que exibir para o cliente, o pedido e os itens relacionados. O código abaixo exemplifica isso:

SqlConnection conn = null;
try
{
    conn = new SqlConnection(GetConnStringFromConfigFile("ConnString"));

    SqlCommand cmdPedidos = new SqlCommand("SELECT * FROM Pedido", conn);
    conn.Open();

    using (SqlDataReader drPedidos = cmdPedidos.ExecuteReader())
    {
        while (drPedidos.Read())
        {
            int pedidoID = drPedidos.GetInt32(0);
            string nome = drPedidos.GetString(1);
            Console.WriteLine(string.Format("Pedido: {0} - Cliente: {1}.", 
                pedidoID, nome));

            SqlCommand cmdItems = new 
                SqlCommand("SELECT * FROM Item WHERE PedidoID = @ID", conn);
            cmdItems.Parameters.AddWithValue("@ID", pedidoID);

            using (SqlDataReader drItems = cmdItems.ExecuteReader())
            {
                while (drItems.Read())
                {
                    string produto = drItems.GetString(1);
                    decimal valor = drItems.GetDecimal(2);
                    Console.WriteLine(
                        string.Format("    Produto: {0} - Valor: {1}", 
                            produto, valor));
                }
            }
        }
    }
}
catch
{
    //Log exception...
}
finally
{
    if (conn != null) conn.Close();
}

O método GetConnStringFromConfigFile retorna uma ConnectionString do arquivo de configuração dado uma key, a qual deverá conter a atributo MultipleActiveResultSets definido como True. Podemos reparar que, com uma única conexão, podemos recuperar dados de diversos DataReaders (drPedidos e drItems) sem a necessidade de termos um conexão específica servindo cada um deles. O resultado deste processamento, é na imagem mostrado abaixo:

Figura 1 – MARS em funcionamento.

ADONET20.zip (118.08 kb)

Publicidade

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s