none
Optimización RRS feed

  • Pregunta

  • Hola buenas tardes. Soy novato en el desarrollo de aplicaciones web utilizando mvc 2 de asp.net. Tengo una aplicación que se conecta a una base de datos. He trabajado con ADO.Net  Entity Data Model, para los servicios CRUD. EL hecho esque en el constructor del Controlador: EmpledadosController intento crear una lista que me permita trabajar  con los datos. Pero he notado que cada vez que hago una llamada a alguna vista Ejemplo: create, edit, delete o details va al contructor del Controlador.por lo que siempre re-crea una lista de empleados y eso implica tiempo. Hay alguna forma de hacer que el objeto Controlador sea persistente es decir que se cree una sola vez?

     

    Gracias.

    domingo, 24 de abril de 2011 18:02

Respuestas

  • No, el objeto controlador se crea y se destruye para cada petición http.

    Por otra parte planteas la optimización del acceso a datos. En primer lugar yo me preguntaría si realmente necesitas la lista de empleados para cada acción del controlador, ya que si no es así, probablemente no se debería cargar dicha lista en el constructor. En su lugar, una alternativa podría ser implementar un esquema de carga perezosa, en la que la lista solo se carga cuando se necesita.

    También me preguntaría si cargar la lista cada vez que se necesite constituye realmente un problema de rendimiento. ¿Cuanto tarda en cargase la lista? ¿Cómo de grande es la lista? ¿Cuantas veces por segundo se carga la lista? serían algunas de las cuestiones que habría de plantearse.

    Si realmente constituye un problema de rendimiento, analizaríamos las diferentes alternativas que tenemos para afrontar el problema. Podríamos enfocarlo de varias maneras:

    • Cacheo de la lista por ejemplo en la cache HTTP.
    • Optimización de la consulta que recupera la lista.
    • Análisis de otros factores de rendimiento: red, servidor de base de datos, etc.

     

    domingo, 24 de abril de 2011 18:50
  • > Alejandro Mosquera1 dice

    > EL hecho esque en el constructor del Controlador: EmpledadosController intento crear una lista que me permita trabajar con los datos

    Pero hasta donde tengo entendido El controlador puede ser:

    1. un archivo físico, como un archivo .aspx en una aplicación de formularios Web Forms.

    2. También puede ser una clase que procesa la solicitud, como un controlador en una aplicación de MVC.

    y como explica que ere novato en esto de mvc, deduzco que esta usando opcion 2 y si esta usando esta opcion esta clase no contiene constructor sino metodos que precesan la solicitud

    > Alejandro Mosquera1 dice

    >Pero he notado que cada vez que hago una llamada a alguna vista Ejemplo: create, edit, delete o details va al contructor del Controlador.por lo que siempre re-

    >crea una lista de empleados y eso implica tiempo

    Es necesario que asi suceda para poder procesar las solicitudes, recuerda que MVC no utiliza los evento, para procesar las solicitudes como ocurria en las aplicacione ASP.Net tradicionales, MVC utiliza los famosos controladores para procesar y validar las solicitudes.

    > Alejandro Mosquera1 dice

    >Hay alguna forma de hacer que el objeto Controlador sea persistente es decir que se cree una sola vez?

    1. Nunca lo he implementado pero tal vez utilizando una clase estatico.

    2. habilitando la cache o

    3. Puede usar las Controladores asyncronicas.

    Una observacion es que, es favorable la recreacion de los datos puesto que esto garantiza que la visualizacion de los datos esten actualizado, y a los mejor evitara problemas de concurrecncias.


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    domingo, 24 de abril de 2011 19:33

Todas las respuestas

  • No, el objeto controlador se crea y se destruye para cada petición http.

    Por otra parte planteas la optimización del acceso a datos. En primer lugar yo me preguntaría si realmente necesitas la lista de empleados para cada acción del controlador, ya que si no es así, probablemente no se debería cargar dicha lista en el constructor. En su lugar, una alternativa podría ser implementar un esquema de carga perezosa, en la que la lista solo se carga cuando se necesita.

    También me preguntaría si cargar la lista cada vez que se necesite constituye realmente un problema de rendimiento. ¿Cuanto tarda en cargase la lista? ¿Cómo de grande es la lista? ¿Cuantas veces por segundo se carga la lista? serían algunas de las cuestiones que habría de plantearse.

    Si realmente constituye un problema de rendimiento, analizaríamos las diferentes alternativas que tenemos para afrontar el problema. Podríamos enfocarlo de varias maneras:

    • Cacheo de la lista por ejemplo en la cache HTTP.
    • Optimización de la consulta que recupera la lista.
    • Análisis de otros factores de rendimiento: red, servidor de base de datos, etc.

     

    domingo, 24 de abril de 2011 18:50
  • > Alejandro Mosquera1 dice

    > EL hecho esque en el constructor del Controlador: EmpledadosController intento crear una lista que me permita trabajar con los datos

    Pero hasta donde tengo entendido El controlador puede ser:

    1. un archivo físico, como un archivo .aspx en una aplicación de formularios Web Forms.

    2. También puede ser una clase que procesa la solicitud, como un controlador en una aplicación de MVC.

    y como explica que ere novato en esto de mvc, deduzco que esta usando opcion 2 y si esta usando esta opcion esta clase no contiene constructor sino metodos que precesan la solicitud

    > Alejandro Mosquera1 dice

    >Pero he notado que cada vez que hago una llamada a alguna vista Ejemplo: create, edit, delete o details va al contructor del Controlador.por lo que siempre re-

    >crea una lista de empleados y eso implica tiempo

    Es necesario que asi suceda para poder procesar las solicitudes, recuerda que MVC no utiliza los evento, para procesar las solicitudes como ocurria en las aplicacione ASP.Net tradicionales, MVC utiliza los famosos controladores para procesar y validar las solicitudes.

    > Alejandro Mosquera1 dice

    >Hay alguna forma de hacer que el objeto Controlador sea persistente es decir que se cree una sola vez?

    1. Nunca lo he implementado pero tal vez utilizando una clase estatico.

    2. habilitando la cache o

    3. Puede usar las Controladores asyncronicas.

    Una observacion es que, es favorable la recreacion de los datos puesto que esto garantiza que la visualizacion de los datos esten actualizado, y a los mejor evitara problemas de concurrecncias.


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    domingo, 24 de abril de 2011 19:33
  • Hola. muchas gracias a las dos personas que respondieron. Los datos de los empleados crecen constantemente y estimamos que sean por lo menos 1000 registros anuales, ademas de los que ya hay, que son por lo menos 3000 registros. Estamos usando LINQ para recuperar la lista. La gestión es básica, tenemos hasta el momento una lista paginada, con opción de búsqueda, eso quiere decir que cada vez que el usuario hace una búsqueda va al controlador y recupera la lista o incluso si la recupero en el método respectivo de la vista, traería otra vez esos 3mil datos. Igual intentaré hacer cacheo de la lista.
    lunes, 25 de abril de 2011 15:25
  • Hola, no sé si ya habrás solucionado tu problema, pero muchas veces cuando se trabaja con volúmenes grandes información que se va a mostrar paginada, la mejor forma de manejarlo es no trayendo todos los datos a la vez, sino solo los de la página a ser mostrada y pedir las demás páginas sobre demanda.

    José María Aguilar posteó hace un tiempo un explicativo ejemplo justamente sobre eso (sobre webgrids). Te dejo el enlace al post http://www.variablenotfound.com/2011/02/webgrid-en-mvc-3-paso-paso-y-ii.html

     

    Saludos!

    viernes, 29 de abril de 2011 22:16
  • Alejandro,

    Hace cacheo de la lista no es la mejor solución a tu problema. Cachear datos que se están "modificando" no es nunca una solución muy buena.

    Como dice Laura, lo mejor es consultar sólo la página que necesites de datos para mandárselas al cliente. Es decir NO cargar toda la lista si no cargar solo los x elementos que mandas al cliente. Si usas EF o Linq-to-Sql eso es muy sencillo:

    var page = employees.Skip(100).Take(10).ToList(); // employees es la colección de datos de Linq-to-sql o de EF

    En este caso page tendría los 10 empleados a partir del 100. Y eso sería lo que mandarías al cliente. Además tanto EF como Linq-to-Sql son lo suficientemente inteligentes como para paginar en la BBDD (es decir NO SE TRAEN todos los empleados y filtran en memoria sinó que le indican a la BBDD que sólo le traiga 10).

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    sábado, 30 de abril de 2011 9:38