none
ASP.Net MVC e Conexões ao Banco de Dados RRS feed

  • Pergunta

  • Prezados,

    Atualmente tenho uma aplicação ASP.NET MVC que possui uma classe estática para estabelecer conexão com o banco de dados. Em alguns testes pude observar que quando inicio o uso da aplicação a partir de várias sessões diferentes, a mesma vai ficando extremamente lenta. Se tenho apenas uma sessão, a mesma funciona de uma maneira aceitável, mas a partir de 3 sessões o uso começa a ficar inviável. 

    A conexão estática está sendo iniciada no Application_Start do Global.asax, creio que esta lentidão se deve a todos concorrerem pela mesma conexão, certo?

    Diante disso, resolvi mudar o funcionamento da mesma, porém tenho duas abordagens que penso em seguir, mas gostaria de uma opinião para saber qual seria a melhor:

    1) Estabelecer uma conexão por sessão iniciada no Global.asax, porém tenho receio que devido a certas ações que a aplicação executa quase que simultaneamente, esta abordagem também apresente lentidão em um dado momento.

    2) Estabelecer uma conexão para cada ação de consulta ao banco de dados, instanciando a conexão, abrindo a mesma, executando a ação e fechando a conexão. Porém,  mais uma vez, devido ao alto numero de ações que a aplicação executa no carregamento de algumas páginas, tenho receio de estourar o pool de conexões trabalhando desta maneira.

    Podem me ajudar? Vocês tem uma visão de outra abordagem que pode ser utilizada?

    Atualmente estamos utilizando ADO.Net e em alguns testes que fizemos com NHibernate mesmo com apenas um usuário a lentidão gigantesca. 

    Desde já agradeço a atenção.



    Samuel Marques

    sexta-feira, 3 de novembro de 2017 13:10

Todas as Respostas

  • Voce nao deveria abrir a conexao como Singleton. 

    Modifique o metodo de acesso ao banco de dados para que a cada execuçao de uma query ela abra a conexao, execute a query e feche a conexao. Deixe o pool de conexoes gerenciar isso.

    Deixo aqui um modelo (se bem que eu prefira usar o Entity Framework) usando ADO.NET:

    http://tutlane.com/tutorial/aspnet-mvc/ado-net-crud-operations-insert-update-delete-in-asp-net-mvc-4-example

    Note como ele executa os metodos CRUD:

            public List<Customer> Selectalldata()
            {
                SqlConnection con = null;
                DataSet ds = null;
                List<Customer> custlist = null;
                try
                {
                    con = new SqlConnection(ConfigurationManager.ConnectionStrings["mycon"].ToString());
                    SqlCommand cmd = new SqlCommand("Usp_InsertUpdateDelete_Customer", con);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@CustomerID", null);
                    cmd.Parameters.AddWithValue("@Name", null);
                    cmd.Parameters.AddWithValue("@Address", null);
                    cmd.Parameters.AddWithValue("@Mobileno", null);
                    cmd.Parameters.AddWithValue("@Birthdate", null);
                    cmd.Parameters.AddWithValue("@EmailID", null);
                    cmd.Parameters.AddWithValue("@Query", 4);
    
                    con.Open(); // abre a coxexao
    
                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = cmd;
                    ds = new DataSet();
                    da.Fill(ds);
    
                    custlist = new List<Customer>();
                    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                    {
                        Customer cobj = new Customer();
                        cobj.CustomerID = Convert.ToInt32(ds.Tables[0].Rows[i]["CustomerID"].ToString());
                        cobj.Name = ds.Tables[0].Rows[i]["Name"].ToString();
                        cobj.Address = ds.Tables[0].Rows[i]["Address"].ToString();
                        cobj.Mobileno = ds.Tables[0].Rows[i]["Mobileno"].ToString();
                        cobj.EmailID = ds.Tables[0].Rows[i]["EmailID"].ToString();
                        cobj.Birthdate = Convert.ToDateTime(ds.Tables[0].Rows[i]["Birthdate"].ToString());
                        custlist.Add(cobj);
                    }
    
                    return custlist;
    
                }
    
                catch
                {
                    return custlist;
                }
    
                finally
                {
                    con.Close();//fecha a conexao
                }
    
            }

    Att


    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 3 de novembro de 2017 14:10