Thanks Leon!!!, I got it!!!

2007/1/2, Leon Rosenberg <[EMAIL PROTECTED]>:

On 1/2/07, Daniel Chacón Sánchez <[EMAIL PROTECTED]> wrote:
> Thanks
>
> Leon, about using the servlet context, I read that on a distributed
> application the share information of the servlet context is not
entererly
> global right?:

Right, but since the data is readonly its ok to have a copy per
webserver, right? It doesn't harm you to put one data-object (even a
complex one) in the application scope. If you need to check for
updates periodically you could make use of the subject-observer
pattern and notify the webservers from the business layer via
rmi/corba/jms/whatever to renew their data or just check if the data
is still valid and replace it if needed periodically in a separate
daemon thread.

>
> *"...In the case of a web application marked "distributed" in its
deployment
> descriptor, there will be one context instance for each virtual machine.
In
> this situation, the context cannot be used as a location to share global
> information (because the information won't be truly global). Use an
external
> resource like a database instead."*
>
>
> About the second solution that you gave to me, I do not understand, you
said
> that for example in my BaseAction Class create a method to put the
objects
> in the request? The problem is that in every request the application
will go
> to the database to load the objects and then put them on the request!
What I
> do not understand is how to put the objects in the request without have
to
> go the database each time that a request is made and the method in the
> BaseAction is call.

BaseAction extends Action{
  private static Data1Class data1;
  private static Data2Class data2;
  ....

  static{
     data1 = createData1FromDB();
     data2 = createData2FromDB();
  }

  //now in my actions i have my own execute method, you may have
something //similar:
        protected void preProcessExecute(
                        ActionMapping mapping,
                        ActionForm af,
                        HttpServletRequest req,
                        HttpServletResponse res)
                        throws Exception{

                req.setAttribute("data1", data1);
                req.setAttribute("data2", data2);
              .........
      }

        protected void postProcessExecute(
                        ActionMapping mapping,
                        ActionForm af,
                        HttpServletRequest req,
                        HttpServletResponse res)
                        throws Exception{

        }

        public abstract ActionForward myExecute(
                ActionMapping mapping,
                ActionForm af,
                HttpServletRequest req,
                HttpServletResponse res)
                throws Exception;


        public final ActionForward execute(
                ActionMapping mapping,
                ActionForm bean,
                HttpServletRequest req,
                HttpServletResponse res)
                throws Exception {


                preProcessExecute(mapping, bean, req, res);
                ActionForward forward = myExecute(mapping, bean, req,
res);
                postProcessExecute(mapping, bean, req, res);
                return forward;
        }
}

You just have to ensure, that when an Action overwrites preProcess it
calls super.preProcess.
The advantage of this method is, that actions at the end of the
hierarchy have a chance to overwrite the data by the base action,
which is quite useful for internationalization and such.

Same rules for updates as for servletContext apply.

regards
Leon


>
> 2007/1/2, Leon Rosenberg <[EMAIL PROTECTED]>:
> >
> > The easiest way is to initialize the data once in the
> > init(ServletConfig) method of the servlet and put them into the
> > application scope (servletcontext). The struts tags will be able to
> > access the data directly, so you don't need to change a bit.
> > Of course the data structures theirself must be threadsafe to access,
> > which shouldn't be a problem if you are only reading them.
> >
> > Alternatively you can perform this in a static initializer in a action
> > and put them in the request scope of each request (if you have a
> > common code block all actions are passing through, like authorization)
> > or into the application scope on first request (which would need a bit
> > of synchronization with double checked locking)
> >
> > regards
> > leon
> >
> > On 1/2/07, Daniel Chacón Sánchez <[EMAIL PROTECTED]> wrote:
> > > Hi all, I'm using struts framework on my application, but I have a
> > > perfomance question.
> > >
> > > When my application starts I load objects in session that may or may
not
> > > will be used (depends on what the user does),  for example I load
the
> > health
> > > centers, hospitals, countries, etc, that will be available for the
users
> > in
> > > html:selects, I know that to had many objects in session is not
good, in
> > > fact each time the user click on one application option (menu) all
the
> > > objects in session are erased, except the ones that I load on the
start
> > of
> > > the application. Is there a way (maybe a pattern) to load this
objects
> > in
> > > the moment that are needed, and not load all at the start of the
> > > application. This object are use on differents modules so I load
them on
> > the
> > > start of the aplication and put them in sesion for not to go to the
> > database
> > > each time I need to load them on a html:select.
> > >
> > > any solution, idea? or that is the only way?
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


Reply via email to