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