none
Web lenta en Server y rápida en Localhost RRS feed

  • Pregunta

  • Hola buenas.

    Estoy trabajando en una web que está ya en producción, resulta que tengo un apartado para administrar la web, y cuando en local estoy implementando tareas, el rendimiento es bastante óptimo, tanto en obtención de datos como en renderizado de la página, el problema viene cuando subo a producción, las pruebas están realizadas con los mismos datos que hay en producción en cambio, se demora muchísimo cuando realiza ciertas acciones.

    No doy con el problema, ya que en local todo funciona bastante bien. ¿Cómo podría saber lo que está pasando?, cuando hago un SelectIndexChanged de un DropDownList para cargar un segundo dependiendo del primero ahí ya se nota algo de demora con respecto al local y eso que solo se trae 5 registro por ejemplo sin relaciones.

    ¿Alguna herramienta para ver si el problema es de SQLSERVER o de otra parte?

    NOTA:

    Server: (SqlServer2008 e IIS7 están en el  mismo servidor)

    Localhost: Sqlserver2012 e IIS7.5)

    La web está realizada en N-Tier UI - BLL - DAL - Entities, para el acceso a datos tengo una clase:

    internal static class Database { 
    
    private static string ObtenerCadenaConexion(){ ... }
    
    private static void DesconexionDB {...}
    
    private static object ConexionDB {...}
    
    internal static DataSet ExecCmd(string cmd, ArrayList params){...}
    
    internal static SqlDataReader ExecCmd(ref object cn, ref SqlDataReader dr) {....}
    
    ...
    
    }

    La cual utilizo para ejecutar consultas.

    Un saludo y gracias

    jueves, 7 de abril de 2016 8:09

Respuestas

  • hola

    >>¿Esto es correcto realizarlo de esta manera en todos los métodos?

    de esa forma aseguras que el objeto de conexion no queda abierto y los objetos se destruyen de forma correcta

    ademas dejas que sea ado.net quien mantenga el pool de conexiones

    >>la cadena de conexión la tengo encriptada en un xml apararte.

    porque no encriptaste la seccion del app.config ?

    igualmente de donde tomes la conexion no afecta

    >>¿No sería mejor reutilizar esa parte de código para la conexión de datos?

    o sea vas a armar clase que ponen en riesgo la creacion de objetos solo por una linea de codigo ? no creo que lo justifique

    

    >>De esta manera eliminaré la clase Database que realiza las tareas que usan los DAL. ¿Es así como se debe hacer?

    las clase de conexion asi como las planteas son para problema

    diseña la cada de datos orientada al negocio

    >>siempre pongo la PK como índices

    eso es correcto, los campos key de la tabla por defecto estan indexados, pero puede que se realice busquedas por otros campos que no lo estan y eso genere problemas de performance

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta dudasc jueves, 7 de abril de 2016 13:09
    jueves, 7 de abril de 2016 13:04

Todas las respuestas

  • hola

    >>¿Alguna herramienta para ver si el problema es de SQLSERVER o de otra parte?

    podrias usar el Sql Profiler para atrapar las queries que se realizan a la db y luego analizar el plan de ejecucion

    quizas la db requiera algun indice para optimizar el acceso

    por lo que veo en el codigo hay algo incorrecto, devolver un SqlDataReader no es buena idea, es mas esos metodos no son correctos, deberias programar en capas sin esa clase Database

    [ASP.NET] GridView – Edición Empleados

    analiza como defino la capa de datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 7 de abril de 2016 12:20
  • Tengo como vi en un artículo tuyo (N-Tier) las distintas capas, y en el DAL vi que se realizaba muchas veces lo siguiente en todos lo métodos del cada clase DAL, al igual que aparece en las clases DAL de tu ejemplo que has indicado:

                using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
                {
                    conn.Open();
                    ...
                 }
    1.

    ¿Esto es correcto realizarlo de esta manera en todos los métodos?, la cadena de conexión la tengo encriptada en un xml apararte.

    ¿No sería mejor reutilizar esa parte de código para la conexión de datos?

    En todos caso aplicaré lo que comentas, realizando para cada uno el using(SqlConnection..

    2.

    De esta manera eliminaré la clase Database que realiza las tareas que usan los DAL. ¿Es así como se debe hacer?

    3

    Voy a informarme Sql Profiler y revisar el tema de índices (que estoy bastante verde) ya que siempre pongo la PK como índices.

    Un saludo gracias.

    jueves, 7 de abril de 2016 12:48
  • hola

    >>¿Esto es correcto realizarlo de esta manera en todos los métodos?

    de esa forma aseguras que el objeto de conexion no queda abierto y los objetos se destruyen de forma correcta

    ademas dejas que sea ado.net quien mantenga el pool de conexiones

    >>la cadena de conexión la tengo encriptada en un xml apararte.

    porque no encriptaste la seccion del app.config ?

    igualmente de donde tomes la conexion no afecta

    >>¿No sería mejor reutilizar esa parte de código para la conexión de datos?

    o sea vas a armar clase que ponen en riesgo la creacion de objetos solo por una linea de codigo ? no creo que lo justifique

    

    >>De esta manera eliminaré la clase Database que realiza las tareas que usan los DAL. ¿Es así como se debe hacer?

    las clase de conexion asi como las planteas son para problema

    diseña la cada de datos orientada al negocio

    >>siempre pongo la PK como índices

    eso es correcto, los campos key de la tabla por defecto estan indexados, pero puede que se realice busquedas por otros campos que no lo estan y eso genere problemas de performance

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta dudasc jueves, 7 de abril de 2016 13:09
    jueves, 7 de abril de 2016 13:04